Xamarin.forms 表单如何禁用导航栏中的后退按钮

Xamarin.forms 表单如何禁用导航栏中的后退按钮,xamarin.forms,Xamarin.forms,我正在使用Xamairn.Forms,当 ViewList正在刷新 实际上,我正在使用下面的代码来禁用默认的后退按钮,但现在我正试图找到另外一个禁用导航栏后退按钮的方法 知道如何禁用导航栏中的后退按钮吗?总体而言,Android和iOS没有正常的API来阻止执行导航栏后退按钮,原因很好,用户希望能够返回,您不应该阻止他们这样做 相反,您应该更改设计,只为用户提供您希望他们能够制作或完全隐藏导航栏的选项,并使用自己的按钮创建自己的导航栏 提供了一个伟大的主题,我希望我会发现,当面对这个问题 他提出

我正在使用Xamairn.Forms,当
ViewList
正在刷新

实际上,我正在使用下面的代码来禁用默认的后退按钮,但现在我正试图找到另外一个禁用导航栏后退按钮的方法


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

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

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

提供了一个伟大的主题,我希望我会发现,当面对这个问题

他提出了与我刚才所做的相同的建议,但也提供了非常黑客的方法,以防止在您拒绝更改设计时返回(下面的代码与上面链接的文章基本相同):

在Android上您可以尝试找到后退按钮,并使用
ContentPage
的ViewModel方法确定是否允许返回。您将在
main活动
中覆盖选项ItemSelected:

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);
                }
            }    
        }
    }
}
[程序集:ExportRenderer(typeof(Page)、typeof(CustomPageRenderer))]
命名空间Mobile.iOS.CustomRenderer{
公共类CustomPageRenderer:PageRenderer{
公共覆盖无效视图将出现(布尔动画){
基本视图将显示(动画);
var page=元素作为CorePage;
如果(第页!=null){
如果((第页).OverrideBackButton){
var root=this.NavigationController.TopViewController;
//注意:这看起来并不完全正确,您需要创建一个映像来正确复制后向箭头
root.NavigationItem.SetLeftBarButtonItem(新的UIBarButtonItem(“{
var navPage=page.Parent作为NavigationPage;
var vm=page.BindingContext作为ViewModel;
if(vm!=null){
var answer=vm.OnBackButtonPressed();
如果(!回答)
navPage.PopAsync();
}否则{
navPage.PopAsync();
}
}),对);
}
}    
}
}
}

在Windows Phone上。。。只需覆盖按下的背面按钮。。。使用WP实际上很简单。

您可以使用以下代码禁用Xamarin表单中的后退按钮按下:

protected override bool OnBackButtonPressed()
{
    return false;
}

我希望它能对您有所帮助。

您可以使用此简单代码防止用户返回 请注意,您应该只有一页 (根页面),用户可以导航回它。 例如,我们有名为“登录”、“主页”和“汽车”的页面 并且根页面是Login

=>内部主页:

Home home= this;
Navigation.PushAsync(new Cars());
Navigation.RemovePage(home);
  

=>您应该对除根页面之外的其他页面执行此操作

禁用“后退”按钮会让用户感觉应用程序没有响应,而当前的方法是正确的,只需提供一条Toast消息来显示一些消息。或者显示循环进度,以便用户知道应用程序正忙。实际上,列表视图的指示器在刷新时起作用,但由于某些原因,用户将按back,我只是在列表视图刷新时搜索停止。谢谢此处也存在类似的解决方案:[这只适用于android吗?它也适用于iOS
Home home= this;
Navigation.PushAsync(new Cars());
Navigation.RemovePage(home);