如何在 Xamarin.Forms 中调用 Navigation.PushAsync 时等待过渡动画完成



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

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

示例代码:

视图:

<Button Command={Binding NavigateCommand} />

viewmodel(我省略了 notifypropertychanged 和 ChangeCanExecute 调用,它们确实存在):

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;
}

现在你会说这有效,确实如此。但是,我们在 Android 中实现了自定义过渡动画,可以将新页面从右侧滑入视图中,并通过向左滑动旧页面来删除旧页面。问题是,PushAsync 方法正在等待,但它在加载页面后立即完成,但在将其移动到视图中的动画完成之前完成。所以在过渡动画中,命令可以再次执行,并且仍然可以执行命令两次。

TLDR: 使用PushAsync时,有没有办法等待页面过渡动画完成?

对,

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

这对我来说似乎仍然是一个有点不稳定的解决方案。最好在过渡结束时通过某种方式进行活动,但似乎即使是编写 xamarin.forms 的人也无法完成此操作。

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

相关内容

  • 没有找到相关文章

最新更新