如何拦截导航栏后退按钮单击Xamarin表单?

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

我能够使用Android.MainActivity.OnBackpressed()拦截在Android中单击的硬件栏后退按钮,但该事件仅在硬件栏上单击按钮时单击,而不是单击导航栏后退按钮.

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

我也试过重写Ondisappear(),有两个问题:

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

那么,是否可以截取导航栏后退按钮?

解决方法

我能够通过覆盖FormsApplicationActivity中的以下方法显示可以取消导航的确认对话框.
// navigation back button
  public override bool OnoptionsItemSelected(IMenuItem item)
  {
     if (item.ItemId == 16908332)
     {
        var currentviewmodel = (Iviewmodel)navigator.CurrentPage.BindingContext;
        currentviewmodel.CanNavigateFromAsync().ContinueWith(t =>
        {
           if (t.Result)
           {
              navigator.PopAsync();
           }
        },TaskScheduler.FromCurrentSynchronizationContext());
        return false;
     }
     else
     {
        return base.OnoptionsItemSelected(item);
     }
  }

  // hardware back button
  public async override void OnBackpressed()
  {
     var currentviewmodel = (Iviewmodel)navigator.CurrentPage.BindingContext;

     // Could display a confirmation dialog (ex: "Cancel changes?")
     var canNavigate = await currentviewmodel.CanNavigateFromAsync();
     if (canNavigate)
     {
        base.OnBackpressed();
     }
  }

navigator.CurrentPage是INavigation服务的包装器.我不必从模态页面取消导航,所以我只处理NavigationStack.

this.navigation.NavigationStack[this.navigation.NavigationStack.Count - 1];

相关文章

vue阻止冒泡事件 阻止点击事件的执行 <div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些