gpt4 book ai didi

xamarin - 如何拦截在 Xamarin 表单中单击的导航栏后退按钮?

转载 作者:行者123 更新时间:2023-12-04 01:02:19 24 4
gpt4 key购买 nike

我有一个 xamarin 表单页面,用户可以在其中更新表单中的一些数据。如果某些数据尚未保存,我需要拦截单击导航栏后退按钮以警告用户。怎么做?

我能够使用 Android.MainActivity.OnBackPressed() 拦截在 Android 中单击的硬件 Bar Back Button ,但该事件仅在单击硬件栏后退按钮时引发,而不是在单击导航栏后退按钮时引发。

我也尝试覆盖 Xamarin.Forms.NavigationPageOnBackButtonPressed()但它不起作用。为什么?
有人已经解决了这个问题吗?

我还尝试了覆盖 OnDisappear() ,有两个问题:

  • 该页面已经在视觉上消失了,所以“你确定吗?”对话框出现在前一页上。
  • 无法取消后退操作。

  • 那么,是否可以拦截导航栏后退按钮的按下?

    最佳答案

    我发现的最好方法是添加我自己的 NavigationRenderer 来拦截导航方法和一个简单的界面

    [assembly: ExportRenderer(typeof(NavigationPage), typeof(CustomerMobile.Droid.NavigationPageRenderer))]

    public class NavigationPageRenderer : Xamarin.Forms.Platform.Android.AppCompat.NavigationPageRenderer
    {
    public Activity context;

    public NavigationPageRenderer(Context context)
    : base(context)
    {}

    protected override Task<bool> OnPushAsync(Page page, bool animated) {...}

    protected override Task<bool> OnPopToRootAsync(Page page, bool animated){...}

    protected override Task<bool> OnPopViewAsync(Page page, bool animated)
    {
    // if the page implements my interface then first check the page
    //itself is not already handling a redirection ( Handling Navigation)
    //if don't then let the handler to check whether to process
    // Navitation or not .
    if (page is INavigationHandler handler && !handler.HandlingNavigation
    && handler.HandlePopAsync(page, animated))
    return Task.FromResult(false);

    return base.OnPopViewAsync(page, animated);
    }
    }
    然后我的 INavigationHandler 界面看起来像这样
    public interface INavigationHandler
    {
    public bool HandlingNavigation { get; }
    public bool HandlePopAsync(Xamarin.Forms.Page view, bool animated);
    public bool HandlePopToRootAsync(Xamarin.Forms.Page view, bool animated);
    public bool HandlePuchAsync(Xamarin.Forms.Page view, bool animated);
    }
    最后,在任何 ContentView 中,在此示例中,当尝试向后导航时,我只是折叠菜单并阻止向后导航。
    public partial class MenusList : INavigationHandler
    {
    public bool HandlingNavigation { get; private set; }

    public bool HandlePopAsync(Page view, bool animated)
    {
    HandlingNavigation = true;
    try
    {
    if (Menu.Expanded)
    {
    Menu.Collapse();
    return true;
    }
    else return false;
    }
    finally
    {
    HandlingNavigation = false;
    }
    }
    }

    关于xamarin - 如何拦截在 Xamarin 表单中单击的导航栏后退按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31696595/

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