【问题标题】:How to wait for transition animation to finish when calling Navigation.PushAsync in Xamarin.forms在 Xamarin.forms 中调用 Navigation.PushAsync 时如何等待过渡动画完成
【发布时间】:2018-02-02 10:04:07
【问题描述】:

我们正在使用 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 时有什么方法可以等待页面过渡动画完成?

【问题讨论】:

    标签: c# mvvm xamarin.forms navigation


    【解决方案1】:

    没错,

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

    这对我来说似乎仍然是一个有点不稳定的解决方案。过渡完成时最好有某种方式来举办活动,但似乎即使是编写 xamarin.forms 的人也无法做到这一点。

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

    【讨论】:

    • 如果你知道过渡时间,你可以在页面的出现时创建一个计时器,一旦时间用完(例如过渡持续时间结束)就会调用一个事件?如果您知道过渡时间,则可以通过找出真正开始过渡的时间来解决此问题。
    • 这就是我现在正在做的一种解决方法。但这仍然是一个有点狡猾的解决方案。我真的希望能够等到过渡实际完成,而不是等待一段时间,然后假设过渡在该时间之后完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 2012-08-23
    相关资源
    最近更新 更多