我们正在使用 xamarin.forms 和 MVVM 模式开发应用程序。我们使用内置导航系统来推送和弹出页面。现在我们在使用命令导航页面时遇到了问题。
假设我们有一个带有导航到另一个页面的按钮的 View 。此导航是通过将 viewmodel 命令绑定(bind)到按钮来完成的。该命令有一个 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 中实现了自定义过渡动画,该动画将新页面从右侧滑入 View ,并通过将旧页面滑出 View 来移除左侧。问题是,PushAsync 方法正在等待,但它在页面加载后立即完成,但在将其移入 View 的动画完成之前。所以在过渡动画期间,可以再次执行命令,仍然可以执行两次命令。
TLDR:
使用 PushAsync 时有什么方法可以等待页面过渡动画完成?
最佳答案
对,
我通过其他 channel 得到了一些关于使用动画监听器的建议。我一直在摆弄一点,但我无法使用它们来解决问题。我查看了 xamarin 表单源代码,似乎在内部,navigationpagerenderer 也不使用事件,而是使用常量 (const int TransitionDuration = 220;) 来等待转换完成。但是,我们使用更长的动画,这会导致问题。在 xamarin.forms 的 master 分支中,TransitionDuration 变量已变为虚拟,因此一旦他们发布包含此代码的版本,我们就可以覆盖。
这对我来说似乎仍然是一个有点不稳定的解决方案。过渡完成时最好有某种方式来举办事件,但似乎即使是编写 xamarin.forms 的人也无法做到这一点。
如果有人有更好的建议,我真的很想听听
关于c# - 在 Xamarin.forms 中调用 Navigation.PushAsync 时如何等待过渡动画完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48580227/