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

时间:2018-02-02 10:04:08

标签: c# mvvm xamarin.forms navigation

我们正在使用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时等待页面转换动画完成?

1 个答案:

答案 0 :(得分:1)

对,

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

这似乎对我来说似乎有点不稳定。在转换结束时,有一些方法可以让事件更好,但看起来甚至是编写xamarin.forms的人都无法实现这一点。

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