Xamarin.Forms 如何禁用导航栏中的后退按钮

标签 xamarin.forms

我正在使用Xamairn.Forms,如何在以下情况下禁用导航栏中的后退按钮 ViewList正在刷新。

实际上,我正在使用以下代码来禁用默认后退按钮,但现在我正在尝试找到方法来禁用导航栏后退按钮

 protected override bool OnBackButtonPressed()
   {
     if (ListView.IsRefreshing)
         return true;
      return false;
   }

知道如何禁用导航栏中的后退按钮吗?

最佳答案

总的来说,Android 和 iOS 没有正常的 API 来阻止执行导航栏后退按钮,原因有一个,即用户希望能够返回,而您不应该阻止他们这样做。

您应该更改您的设计,仅向用户提供您希望他们能够完全制作或隐藏导航栏的选项,并使用您自己的按钮创建您自己的导航栏。

Adam's guide提供了对该主题的一个很好的概述,我希望在面对这个问题时能够找到它。

他建议了我刚才做的同样的事情,但也提供了非常hacky的方法来防止如果你拒绝改变你的设计就返回(下面的代码从上面链接的文章中大部分没有改变):

在 Android 上,您可以尝试找到后退按钮并使用 ContentPage 的 ViewModel 方法来确定是否允许返回。您可以在 MainActivity 中覆盖 OnOptionsItemSelected:

public override bool OnOptionsItemSelected(IMenuItem item) {
    var app = Application.Current;

    if (item.ItemId == 16908332) { // This makes me feel dirty.
        var navPage = ((app.MainPage.Navigation.ModalStack[0] as MasterDetailPage).Detail as NavigationPage); // Notice this code assumes it is looking for a MasterDetailPage being shown as a modal

        if (app != null && navPage.Navigation.NavigationStack.Count > 0) {
            int index = navPage.Navigation.NavigationStack.Count - 1;

            var currentPage = navPage.Navigation.NavigationStack[index];

            var vm = currentPage.BindingContext as ViewModel; //You would want to cast this to a base ViewModel or a specific one so that OnBackButtonPressed() can be called

            if (vm != null) {
                var answer = vm.OnBackButtonPressed();
                if (answer) {
                    return true;
                }
            }
        }
    }

    return base.OnOptionsItemSelected(item);
}

在 iOS 上,您需要一个自定义渲染器来将真正的后退按钮切换为您自己的自定义按钮:

[assembly: ExportRenderer(typeof(Page), typeof(CustomPageRenderer))]
namespace Mobile.iOS.CustomRenderer {
    public class CustomPageRenderer : PageRenderer {

        public override void ViewWillAppear(bool animated) {
            base.ViewWillAppear(animated);

            var page = Element as CorePage;

            if (page != null) {
                if ((page).OverrideBackButton) {
                    var root = this.NavigationController.TopViewController;
                    // NOTE: this doesn't look exactly right, you need to create an image to replicate the back arrow properly
                    root.NavigationItem.SetLeftBarButtonItem(new UIBarButtonItem("< Back", UIBarButtonItemStyle.Plain, (sender, args) => {
                        var navPage = page.Parent as NavigationPage;
                        var vm = page.BindingContext as ViewModel;

                        if (vm != null) {
                            var answer = vm.OnBackButtonPressed();

                            if (!answer)
                                navPage.PopAsync();
                        } else {
                            navPage.PopAsync();
                        }
                    }), true);
                }
            }    
        }
    }
}

在 Windows Phone 上...只需覆盖 OnBackButtonPressed...使用 WP 实际上非常简单。

关于Xamarin.Forms 如何禁用导航栏中的后退按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41978276/

相关文章:

c# - Xamarin 表单绑定(bind)。如何根据某些条件显示 3 个不同字符串中的 1 个

xamarin.forms - Xamarin 形式的流畅设计

c# - Xamarin.Forms.Platform.iOS.ViewCellRenderer.GetCell 异常 : Specified cast is not valid

c# - 如何在 Xamarin 表单的页面构造函数中从一个页面导航到另一页面

c# - 如何使用 Xamarin.Forms 的媒体插件在共享代码中实现 iOS 覆盖?

c# - Xamarin 表单和 Android 蓝牙

wpf - Azure 客户端 ID、租户和 Key Vault URI 是否被视为 secret ?

xamarin - Xamarin.Forms是否支持定期后台任务?

c# - 在 Xamarin 中将 cookie 放在 WebView 上

ios - Xamarin Forms iOS Deploy with simulator 安装失败错误