C# 在Xamarin.forms中调用Navigation.PushAsync时如何等待转换动画完成

C# 在Xamarin.forms中调用Navigation.PushAsync时如何等待转换动画完成,c#,mvvm,xamarin.forms,navigation,C#,Mvvm,Xamarin.forms,Navigation,我们正在使用xamarin.forms和MVVM模式开发一个应用程序。我们使用内置导航系统来推送和弹出页面。现在我们在使用命令导航页面时遇到了一个问题 假设我们有一个带有按钮的视图,可以导航到另一个页面。此导航通过将viewmodel命令绑定到按钮来完成。该命令有一个canExecute检查,它检查“IsBusy”属性,以防止按钮被单击两次并启动两个页面导航 示例代码: 视图: 现在你会说这是可行的,这是一种可行的方法。然而,我们已经在Android中实现了自定义的转换动画,可以从右侧将新页面滑

我们正在使用xamarin.forms和MVVM模式开发一个应用程序。我们使用内置导航系统来推送和弹出页面。现在我们在使用命令导航页面时遇到了一个问题

假设我们有一个带有按钮的视图,可以导航到另一个页面。此导航通过将viewmodel命令绑定到按钮来完成。该命令有一个canExecute检查,它检查“IsBusy”属性,以防止按钮被单击两次并启动两个页面导航

示例代码:

视图:

现在你会说这是可行的,这是一种可行的方法。然而,我们已经在Android中实现了自定义的转换动画,可以从右侧将新页面滑入视图,并通过将旧页面滑出视图左侧来删除旧页面。问题是,PushAsync方法正在等待,但它会在加载页面时完成,但在将其移动到视图中的动画完成之前完成。因此,在过渡动画期间,该命令可以再次执行,并且仍然可以执行该命令两次

TLDR: 使用PushAsync时,有没有办法等待页面转换动画完成

我通过其他渠道得到了一些关于使用动画监听器的建议。我一直在摆弄一些东西,但我无法用它们来解决这个问题。我查看了xamarin表单源代码,在内部,navigationpagerenderer似乎也不使用事件,而是使用常量(const int TransitionDuration=220;)等待转换完成。但是,我们使用较长的动画,这会导致问题。在xamarin.forms的主分支中,TransitionDuration变量已变为虚拟变量,因此我们可以在它们发布包含此代码的版本后进行重写

对我来说,这似乎仍然是一个有点不可靠的解决方案。最好在转换完成后以某种方式举办一次活动,但似乎连编写xamarin.forms的人都无法做到这一点


如果有人有更好的建议,我真的很想听听

如果你知道转换时间,你能在页面的onappearing中创建一个计时器,在时间用完时立即调用事件(例如转换持续时间结束)?如果你知道过渡时间,你也许可以通过找出它真正开始过渡的时间来解决这个问题。这就是我现在正在做的工作。但这仍然是一个有点狡猾的解决方案。我真的希望能够等到过渡实际完成,而不是等待一段时间,并假设过渡在这段时间之后完成。
<Button Command={Binding NavigateCommand} />
Public bool IsBusy {get => _isBusy set => {_isBusy = value;}}
Public ICommand NavigateCommand = New Command(Navigate, () => !IsBusy);

async private Task Navigate()
{
    IsBusy = true;
    await Navigation.PushAsync(new OtherPage());
    IsBusy = false;
}