【问题标题】:Detect Back Arrow Press Of The NavigationPage in Xamarin Forms检测 Xamarin 表单中 NavigationPage 的后退箭头按下
【发布时间】:2019-08-26 17:38:28
【问题描述】:

有没有什么方法可以检测 Xamarin 表单中导航页面的后退按钮的按下?

【问题讨论】:

标签: xamarin xamarin.forms navigation


【解决方案1】:

您可以覆盖导航页面的“OnBackButtonPressed”方法:

protected override bool OnBackButtonPressed()
{

    Device.BeginInvokeOnMainThread(async () =>
    {
        if (await DisplayAlert("Exit?", "Are you sure you want to exit from this page?", "Yes", "No"))
        {
            base.OnBackButtonPressed();
            await App.Navigation.PopAsync();
        }
    });

    return true;
}

如果你使用的是shell,你可以覆盖Shell的OnNavigating事件:

void OnNavigating(object sender, ShellNavigatingEventArgs e)
{
    // Cancel back navigation if data is unsaved
    if (e.Source == ShellNavigationSource.Pop && !dataSaved)
    {
        e.Cancel();
    }
}

更新: OnBackButtonPressed 事件只会在用户按下硬件后退按钮时在 Android 上触发。

当任何页面消失时,您似乎更有兴趣实施您想做的事情! 在这种情况下: 你有页面的两种方法 -

    protected override void OnAppearing()
    {
        base.OnAppearing();
        Console.WriteLine("Hey, Im coming to your screen");
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        Console.WriteLine("Hey, Im going from your screen");
    }

您可以在任何页面上覆盖这两种方法以跟踪它们何时出现和消失。

【讨论】:

  • OnBackButtonPressed 永远不会被 ContentPage 调用。你能告诉我同样的原因吗?
  • 因为它必须在导航页面内。
  • 在导航页里面。我可以从导航堆栈中获取页面实例。
  • 当在 android 上按下硬件后退按钮时将引发此事件。此事件不会在 iOS 上引发。
  • @a.palo 检查更新的答案,如果这是您正在寻找的东西。
【解决方案2】:

您必须使用自定义渲染器覆盖本机导航栏按钮行为。 OnBackButtonPressed 仅触发物理设备按钮。你可以阅读好文章如何实现这个here

【讨论】:

    【解决方案3】:

    最近对 Xamarin 表单的更新意味着您现在可以在使用 Shell Navigation 制作的应用程序中执行此操作,以便在两个平台上进行导航返回箭头。

    使用 Shell.SetBackButtonBehavior 方法,例如在页面对象的构造函数中运行此代码将允许仅在绑定的视图模型不忙时进行后退导航:

        Shell.SetBackButtonBehavior(this, new BackButtonBehavior
        {
            Command = new Command(async() =>
            {
                if (ViewModel.IsNotBusy)
                {
                    await Shell.Current.Navigation.PopAsync();
                }
    
            })
        });
    

    在命令的正文中,您可以在拦截后退按钮的单击时做任何您需要做的事情。

    • 请注意,这只会影响导航返回按钮,而不影响 Android 硬件返回按钮 - 根据上述答案需要单独处理。您可以编写一个从按下后退按钮覆盖和 shell 后退按钮行为位置上的命令调用的共享方法来共享逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2016-12-08
      • 2014-09-03
      相关资源
      最近更新 更多