Xamarin Forms MasterDetailPage - 在 iOS 上绘制了两次二级菜单

Xamarin Forms MasterDetailPage - Secondary menu drawn twice on iOS

我的应用使用主从导航。
我在导航堆栈上推送页面以具有后退按钮功能。
使用 ToolbarItems(二级菜单)推送页面时,在 Android 上没问题,但它会使 iOS 上的菜单项加倍。
切换到同一页面(不推送),iOS 没有问题(二级菜单显示一次,符合预期)。

我采用了官方的MasterDetail示例(https://github.com/xamarin/xamarin-forms-samples/tree/master/Navigation/MasterDetailPage) to show what I mean, see solution zip file.

编译并在iOS设备上启动,在第一页按下按钮打开子页面,你应该看到双倍的菜单项(实际上是绘制了两次),所以有两个多行二级菜单项可见,而不仅仅是一个。
这两行是相同的,两行(及其菜单项)在点击时都会做出反应。

如果您通过汉堡包菜单 select 提醒页面,则二级菜单没问题(即使在 iOS 上),因为页面不会被推送到导航堆栈上,而是会切换。

一些有趣的部分:

ContactsPage.xaml.cs:
SwitchToDetailPageAndPushOnNavStack()

ReminderPage.xaml:
<ContentPage.ToolbarItems> <ToolbarItem Text="Do something" Clicked="OnDoSomethingClicked" Order="Secondary" /> </ContentPage.ToolbarItems>

我该怎么做才能摆脱对 iOS 的这种奇怪影响?

看起来您正在添加一个新的 NavigationPage,这似乎是导致问题的原因。你阻止额外的导航栏: NavigationPage.SetHasNavigationBar(newPage, false); 但添加的工具栏项目仍然被添加了两次。

如果您采用常规方式推送页面,则此问题就会消失。例如。在 ContactsPage.xaml.cs 文件中,更改:

private void OnOpenSubPageClicked(object sender, EventArgs args)
{
    Device.BeginInvokeOnMainThread(() =>
    {
           MainPage mainPage = App.Instance.MainPage as MainPage;
           if (null != mainPage)
                mainPage.SwitchToDetailPageAndPushOnNavStack(mainPage.MasterPage.RemindersPageItem);
    })
}

至:

private async void OnOpenSubPageClicked(object sender, EventArgs args)
{
      await Navigation.PushAsync(new ReminderPage());
}

这似乎符合预期。

我遇到了类似的问题。在这里张贴以防其他人发现自己陷入困境。

当我在 App.cs...

中有这段代码时,我得到了双工具栏
MainPage = new NavigationPage(new MyApp.Home());

但将其更改为

MainPage = new MyApp.Home();

为我解决了这个问题。