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

时间:2017-02-01 11:09:42

标签: xamarin.forms

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

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

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

我知道如何在导航栏中禁用后退按钮?

3 个答案:

答案 0 :(得分:3)

整体Android和iOS没有正常的API来阻止导航栏后退按钮被执行的一个很好的理由,用户希望能够返回,你不应该阻止他们这样做。

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

Adam's guide提供了一个很好的主题视图,我希望在面对这个问题时我会发现它。

他建议我做了同样的事情,但是如果你拒绝改变你的设计,也会提供非常黑客的方法来阻止导航(下面的代码与上面链接的文章大致相同):

在Android 上,您可以尝试查找后退按钮,并使用ContentPage的ViewModel方法查看是否应该允许返回。您将覆盖OnOptionsItemSelected中的MainActivity

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实际上很容易一次。

答案 1 :(得分:0)

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

ts_failure = datetime.datetime(2019, 5, 15, 19, 48, 2, 495)
nearest_idx = np.searchsorted(df['Timestamp'], ts_failure) - 1
nearest_time = df.iloc[nearest_idx]['Timestamp']
t_500ms = nearest_time - pd.Timedelta(milliseconds = 500)
df.index = df['Timestamp']
df2 = df.loc[t_500ms: nearest_time]

希望它能对您有所帮助。

答案 2 :(得分:0)

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

=>主页内:

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

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