我有一个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];