我们正在使用xamarin.forms开发一个应用程序并使用MVVM模式。我们使用内置的导航系统来推送和弹出页面。现在,当使用命令导航页面时,我们遇到了一个问题。
假设我们有一个带有导航到另一个页面的按钮的视图。通过将viewmodel命令绑定到按钮来完成此导航。该命令有一个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时等待页面转换动画完成?
答案 0 :(得分:1)
对,
我通过其他渠道获得了一些关于使用动画听众的建议。我一直在摆弄,但我无法用它们来解决这个问题。我已经看了一下xamarin表单源代码,看起来在内部,navigationpagerenderer也没有使用事件,而是使用常量(const int TransitionDuration = 220;)来等待转换完成。但是,我们使用更长的动画,这会导致问题。在xamarin.forms的主分支中,TransitionDuration变量已变为虚拟变量,因此我们可以在它们发布包含此代码的版本时进行覆盖。
这似乎对我来说似乎有点不稳定。在转换结束时,有一些方法可以让事件更好,但看起来甚至是编写xamarin.forms的人都无法实现这一点。
如果有人有更好的建议,我真的很想听到它