【问题标题】:Missing menu button on MasterDetailPage when assigning App.MainPage分配 App.MainPage 时 MasterDetailPage 上缺少菜单按钮
【发布时间】:2016-08-28 12:14:51
【问题描述】:

我有一个小应用程序,我需要从 ContentPage 切换到 MasterDetailsPage

MainPage = new NavigationPage(new MyContentPage());

现在,如果登录成功,我想将 Root 更改为 MainPage = new NavigationPage(new MyMasterDetailpage());

MasterDetailsPage 显示出来了,但是导航栏中的按钮不见了。

如果我只是使用

Navigation.PushModalAsync(new MyMasterDetailpage());

我什至没有导航栏,有

Navigation.PushModalAsync(new NavigationPage(new MyMasterDetailpage()));

菜单图标又不见了。

我可以在这里做什么?

更新

看来我的问题只在安卓上,不知道new NavigationPage(new MyDetailView)汉堡包只出现在安卓上。

【问题讨论】:

  • 我遇到了同样的问题,您找到解决方案了吗?
  • @DonBox 不,我没有。我改变了 MasterDetailPage 的显示方式和时间。我的解决方案是从一开始就设置MainPage = new MyMasterDetailpage(),然后在其上放置一个模态MyContentPage()。如果登录成功,我只需在显示 MasterDetailPage 的代码中弹出模式。 NavoigationPage 中的 MasterDetail 似乎不起作用,也不需要我现在这样做
  • 谢谢!我看到的是如果应用程序以MainPage = new NavigationPage(new MyMasterDetailPage()) 开头,它可以工作,我可以看到滑动菜单按钮。但是如果应用程序以不同的 MainPage 启动,然后我将其设置为 new NavigationPage(new MyMasterDetailPage()),则滑动菜单按钮不可见。菜单在那里,因为如果我滑动它就会出现。也许这只是一个 UI 刷新问题。我什至正在考虑通过拥有NavigationPageContentPages 从头开始​​编写MD。滑块菜单将在ContentPage 页面内动态创建。还在想这个……
  • @Don Box 你有解决方案吗?我也有同样的问题。?

标签: android xamarin navigation xamarin.forms


【解决方案1】:

Detail 页面是NavigationPage 时,NavigationMenu 会出现在MasterDetailPage 中。因此,您可以将其设置为 MainPage,而不是将 MasterDetailsPage 推送到 Navigation 堆栈。然后在 MasterDetailPage 中,您需要在 NavigationPage 中添加 DetailPage。 您可以使用MasterPage 的 Icon 属性为菜单设置图标 下面是一个例子,

public class DashboardPage : MasterDetailPage
{
    DetailPage detailPage; 
    MenuPage  masterPage;
    NavigationPage detailNavigationPage;

    public DashboardPage ()
    {
        detailPage = new DetailPage ();
        detailNavigationPage=new NavigationPage(detailPage); // Navigation Page as parent for Detail Page.
        Detail = detailNavigationPage; 

        masterPage= new MenuPage(){Icon="ic_settings.png"}; // ic_settings.png willbe rendered as Menu Icon.
        Master = masterPage;

    }
}

【讨论】:

  • 这里的问题是,MasterDetail 不是我的根页面。如果我从一开始就将我的 MasterDetail 设置为 root,整个树看起来就像 NavigationPage( contentPage -> contentPage -> MasterDetailPage ),它工作得很好
  • 您无需将 MasterDetailPage 添加到 NavigationPage。您可以将 MasterDetailPage 设置为其他页面的根页面,例如 Application.Current.MainPage= new MyMasterDetailPage();
  • 我已经试过了,如果我按照你说的做,上面的整个酒吧都不见了,当然还有菜单汉堡
  • 能分享一下MasterDetailPage和MasterDetailPage之前的Page的sn-ps吗?
  • Thats my master detail from xamarin samples 和前面的 sn-ps 就是你刚才说的。我试过设置新的 MainPage,我试过 PushAsync 和其他我能猜到的东西
【解决方案2】:

我遇到了同样的问题。但解决方案是改变流程。您首先要加载登录视图,然后显示 MasterDetail 的视图。我解决了这个问题:

当您启动应用程序时,我创建了 MasterDetail 的视图并立即将登录视图显示为一个对话框,如果登录成功,只需关闭该对话框。代码看起来像这样:

public App()
{
    DependencyService.Register<IMessageService, MessageService>();
    DependencyService.Register<INavigationService,NavigationService>();

    InitializeComponent();

    MainPage = new NavigationPage(new MasterDetail());

    MercaFacil.App.Current.MainPage.Navigation.PushModalAsync(new NavigationPage(new LoginView()));
}

登录成功后直接调用PopModalAsync()方法

【讨论】:

    【解决方案3】:

    通过设置母版页的图标,您应该会在导航栏中获得作为按钮提供的图像。

    在您的 MyMasterDetailpage 中尝试这样的操作

    public class MyMasterDetailpage: MasterDetailPage
    {
        public MyMasterDetailpage()
        {
            Detail = new NavigationPage (new Page());
            Master = new MenuPage () {
                Title = "Title",
                Icon = (Device.OS == TargetPlatform.iOS) ? "hamburgermenuicon.png" : null
            };
        }
    }
    

    【讨论】:

    • 为什么要手动添加图标?如果我将我的 MasterDetailPage 用作应用程序的根,我会得到一个动画汉堡?!
    • 只有在 android 上才能在 iOS 上获得动画效果
    • 好的,我知道了,不知道谢谢。但是我的问题与android有关。如果因为如果我重新分配 Application.MainPage 我只会在那里得到一个空白导航栏
    • 据我所知,Android 上也需要标题,否则我会遇到异常
    • 看我怎么设置detail page,设置root是这样的:Application.Current.MainPage= new MyMasterDetailPage();
    【解决方案4】:

    如果您使用 PushModalAsync 推送 MasterDetailPage,则导航栏将不会显示,因为它将在全屏模式下将页面作为模态打开。 如果您将页面推送为:

    await Navigation.PushAsync(new MyMasterDetailPage());
    

    然后您将在导航栏上获得一个后退按钮,单击它会将您向后移动到之前的页面。所以你的汉堡图标将不可见。

    选项是将 MasterDetailPage 设置为 MainPage

    App.Current.MainPage = new MyMasterDetailPage();
    

    如果您想要在 MasterDetailPage 之前添加的页面,您可以覆盖您的 android 活动中的 OnBackPressed() 方法,并将您的页面推送到导航堆栈中并弹出您当前的 MasterDetailpage。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-04
      • 2021-03-12
      • 2018-01-20
      • 2021-04-20
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多