【问题标题】:How can I prevent additional navigation bar on top of MasterDetailPage (Xamarin on Android)如何防止 MasterDetailPage 顶部的附加导航栏(Android 上的 Xamarin)
【发布时间】:2019-11-07 07:14:29
【问题描述】:

我正在 Xamarin Forms (4.0) 中为 Android (Android 8.1) 创建一个应用程序。 我的主页是 MasterDetailPage,我将详细信息页面设置为:

this.Detail = new NavigationPage(new SomePage());

当我想将详细信息导航到另一个页面(以便“返回”按钮正常工作)时,我只是这样做:

this.Detail.Navigation.PushAsync(new NavigationPage(new SomeOtherPage());

这一切都很好,但我留下了一个带有后退按钮的附加导航栏:

如果我这样做NavigationPage.SetHasBackButton(this, false);,后退按钮会消失,但导航栏会留下,所以我的页面顶部有一个蓝色的大矩形。如果我这样做NavigationPage.SetHasNavigationBar(this, false);,那么导航栏标题栏(带有汉堡菜单)都会消失!有没有办法用后退按钮隐藏导航栏但保留主/详细标题栏(带汉堡菜单)?

【问题讨论】:

  • 什么是汉堡菜单不再可见。只剩下标题了?您可以添加更多代码或屏幕截图吗?正如 Jason 所说,一个 NavigationPage 实例对您来说就足够了。
  • 你在真机上测试过吗?
  • 对不起,我没有看到你的评论。不,我没有在真实设备上测试过。从我的其他评论中复制/粘贴:'如果您在 VS2017/2019 中创建新的跨平台移动应用程序 (Xamarin.Forms),您可以看到效果。生成的应用程序有一个包含项目列表的主/详细信息页面。如果您点击一个项目,您将进入项目详细信息表单。发生这种情况时,您会失去主/详细汉堡菜单。您可以通过在 NavigationPage 中包装详细信息页面来避免这种情况,但是这会显示一个额外的后退按钮栏(在我的原始屏幕截图中可见)'。
  • 我想要达到的效果是让 Master/detail 菜单始终可用,即使 Detail 页面导航到其他地方。如果我将详细信息页面包装到 NavigationPage 中,这实际上效果很好......但我得到了两个标题栏。

标签: xamarin xamarin.forms xamarin.android


【解决方案1】:

你只需要一个NavigationPage的实例

this.Detail.Navigation.PushAsync(new SomeOtherPage());

【讨论】:

  • 如果我这样做,那么汉堡菜单不再可见。只剩下标题了。
【解决方案2】:

您可以将新的MasterDetailPage 分配给根,然后处理后按。由于这不应该工作,你必须破解一下。

【讨论】:

  • > “因为这不应该工作,你必须破解一下”。为什么你说这不应该工作?该文档明确指出,不应将 MasterDetailPage 详细信息设置为常规内容页面,而应将其包装在 NavigationPage 中。由于 NavigationPage 的主要目的是提供导航,因此不工作会很奇怪。无论如何,一切正常(导航完美),我只想删除导航栏而不删除 MasterDetailPage 菜单按钮。
  • 但请注意,每个人都已经说过您不应该推送包裹在 NavigationController 中的新页面。就像您要求一辆卡车来装载您的货物,然后还要求在该卡车内为您的货物创建一辆新卡车。如果您查看屏幕截图,它看起来与我在此示例中描述的完全一样,您的卡车中有一辆卡车,它们的行为出乎意料,因为这根本不是人们应该做的事情。
  • 请看我对杰森的回答。如果我不将页面包装在 NavigationPage 中(换句话说,如果我执行 this.Detail.Navigation.PushAsync(new SomeOtherPage())),那么汉堡菜单就会消失。只剩下标题了。我无法再访问母版页。
  • 是的,这正是我所说的。这是不允许的。即使在本机应用程序中,如果您导航,您也不会拥有汉堡包。这不是导航在 Android 上的工作方式。如果您想要一些自定义解决方案,您可以使用一些技巧或从头开始构建它。如果你想忽略微软官方员工和几个有很多观点的用户都给出了完全相同的建议......请不要回复。
  • 我在问一个简单的问题 - 我可以隐藏附加栏吗?如果您会回答“由于 X/Y,这是不可能的”,我会接受您的回答。至于'假装更聪明'这句话我真的不明白你的问题是什么。如果这个问题以某种方式“冒犯”了你,那么请继续忽略它。
【解决方案3】:

确保您的MainPage 仅设置为MasterDetailPage。 曾经,我有一个案例,有人做了这样的事情:

MainPage = new NavigationPage(new MasterDetailPage());

当然应该这样定义:

MainPage = new MasterDetailPage();

那么,您的DetailPage 应该只定义一次,如下所示:

Detail = new NavigationPage(new MyPage());

【讨论】:

  • > MainPage = new NavigationPage(new MasterDetailPage()); MasterDetailPage 是应用程序的主页,它不包含在导航页面中。 >MainPage = new MasterDetailPage();这就是我所做的。 > DetailPage = new NavigationPage(new MyPage());你的意思是 Detail = = new NavigationPage(new MyPage());这也是我所做的。问题是当我导航到不同的详细信息页面时(请参阅原始问题)。
  • 你能提供更多关于你正在做的导航的细节吗?你究竟是如何导航的?您使用的是 Prism 之类的东西还是只是默认的导航服务?
  • 在VS2017/2019新建跨平台移动应用(Xamarin.Forms)可以看到效果。生成的应用程序有一个包含项目列表的主/详细信息页面。如果您点击一个项目,您将进入项目详细信息表单。发生这种情况时,您会失去主/详细汉堡菜单。您可以通过在 NavigationPage 中包装详细信息页面来避免这种情况,但是这会显示一个额外的后退按钮栏(在我的原始屏幕截图中可见)。
  • 好的,就像有人写的那样,这不是所有平台上的预期行为。原因是如果您从根页面进行任何导航,您将无法返回(只能使用返回按钮)。默认行为是您的根详细信息页面有汉堡菜单,只要您导航到某个地方,它就会显示返回按钮,而不是汉堡菜单图标。不过,您可以从左侧滑动以拉出菜单。当然,有一种方法可以解决这个问题,但是您必须为每个平台编写自定义渲染器。我知道如何在 Android 上做到这一点,但对 iOS 不太确定。
【解决方案4】:

Xamarin Forms 似乎并不真正支持我尝试使其工作的方式。如果您将 Detail 导航到另一个页面,您实际上会失去对 MasterDetailPage 的 Master 部分的访问(至少在某些设备上)。我试图通过将目标详细信息页面包装到另一个 NavigationPage 中来避免这种情况,但在模拟器中工作,但这只是偶然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2017-01-24
    • 2017-05-07
    • 2012-05-07
    • 1970-01-01
    相关资源
    最近更新 更多