【问题标题】:Cant Exit the App After Make BackButton Override Method in Xamarin Forms在 Xamarin 表单中创建 BackButton 覆盖方法后无法退出应用程序
【发布时间】:2017-11-22 07:07:38
【问题描述】:

所以以前我想让我的应用程序在按下 Pyshical BackButton 后返回到 MainPage。我已经这样做了,但问题是当我在 MainPage 上并按下 Pyhsical 按钮时,而不是关闭应用程序它不会去任何地方。第二个问题是当页面堆栈为 2(MainPage > News > NewsDetail)时,它直接进入 MainPage(DetailNews > MainPage)。我想要做的是弹出到上一页(DetailNews > News > MainPage > )。这是我覆盖后退按钮的完整代码

  public bool DoBack
        {
            get
            {
                MasterDetailPage mainPage = App.Current.MainPage as MasterDetailPage;

                if (mainPage != null)
                {
                    bool canDoBack = mainPage.Detail.Navigation.NavigationStack.Count > 1 || mainPage.IsPresented;

                    // we are on a top level page and the Master menu is NOT showing
                    if (!canDoBack)
                    {
                        // don't exit the app just show Dashboard
                        //mainPage.IsPresented = true;

                        Type page = typeof(DrawerPage);

                        mainPage.Detail = new NavigationPage((Page)Activator.CreateInstance(page));
                        return false;
                    }
                    else
                    {
                        return true;
                    }
                }
                return true;
            }
        }

我应该在此处添加或更改什么代码来做到这一点,有什么建议吗?

【问题讨论】:

    标签: c# xamarin xamarin.forms


    【解决方案1】:

    第一个问题: 你的逻辑是错误的。如果要留在 MainPage,则需要返回 true。

      public bool DoBack
            {
                get
                {
                    MasterDetailPage mainPage = App.Current.MainPage as MasterDetailPage;
    
                    if (mainPage != null)
                    {
                        bool canDoBack = mainPage.Detail.Navigation.NavigationStack.Count > 1 || mainPage.IsPresented;
    
                        // we are on a top level page and the Master menu is NOT showing
                        if (!canDoBack)
                        {
                            // don't exit the app just show Dashboard
                            //mainPage.IsPresented = true;
    
                            Type page = typeof(DrawerPage);
    
                            mainPage.Detail = new NavigationPage((Page)Activator.CreateInstance(page));
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                    return true;
                }
            }
    

    第二个问题: 之所以直接从DetailsNews转到MainPage,是因为你调用的是PopToRoot而不是Pop。阅读此article

    【讨论】:

    • 是的,它可以关闭,但是当我在 NewsPage 中它转到 MainPage 时它会关闭所有内容,然后立即关闭它看起来好像主页条件始终为空,因此它永远不会返回 else 条件。所以 else 条件已经是正确的,它必须返回 true ,现在的问题是为什么即使 i 在 MainPage 中它也永远不会返回 else 条件
    • 我无法回答这个问题。这只是一小段代码。我建议您使用调试器并检查 App.Current.MainPage 和其他部分中的内容。
    • 我已经调试了我的代码,我发现了我的问题,NavigationStack.Count 始终为 1,当我在 MainPage 中时,NavigationStack 为 1,当我导航到新闻时,NavigationStack 为 1 t0o .是什么让这发生?为什么 NavigationStack 总是 1 任何建议?
    • 您可能不会在新闻页面上调用 push(DetailNews),而是将 DetailNews 分配给 MainPage.Detail。
    • 是的,我正在使用这个 Detail = new NavigationPage((Page)Activator.CreateInstance(page)); ,我尝试了 Detail.Navigation.PushAsync((Page)Activator.CreateInstance(page));它的工作,但它只工作一次,navigationstack.count 是 2 但是当我尝试再次导航到新闻时,navigationstack 计数只有 1。这是一个错误吗?或者我需要添加一些代码
    【解决方案2】:

    我已经找到解决方案,我在每个详细信息页面中覆盖 OnBackButtonPressed

      protected override bool OnBackButtonPressed()
                {
                    Device.BeginInvokeOnMainThread(async () => {
                        Application.Current.MainPage = new DrawerPage();
                    });
    
                    return true;
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      相关资源
      最近更新 更多