c# - 在 Xamarin.forms 中调用 Navigation.PushAsync 时如何等待过渡动画完成

标签 c# mvvm xamarin.forms navigation

我们正在使用 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/

相关文章:

c# - 如何使用 MVVM 从 DataGrid 传递有关所选项目的信息

ios - 在横向模式下隐藏菜单页面 iPad 主详细信息页面

c# - Datagrid RowDetails 未更新

android - Xamarin.Forms ListView 通过代码设置 SelectedItem

c# - Xamarin-在Gridview中创建一个额外的列,其垂直跨度为2

c# - 在 C# 中读取 .db 文件

c# - 从 HttpWebResponse 获取重定向 URL 的集合

c# - 为什么 System.Type.IsPublic 返回为 false?

c# - 从验证器类记录

javascript - Silverlight 4 MVVM : Call Javascript function from viewmodel