gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:32:57 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com