分配 App.MainPage 时 MasterDetailPage 上缺少菜单按钮
Posted
技术标签:
【中文标题】分配 App.MainPage 时 MasterDetailPage 上缺少菜单按钮【英文标题】:Missing menu button on MasterDetailPage when assigning App.MainPage 【发布时间】: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 刷新问题。我什至正在考虑通过拥有NavigationPage
和ContentPage
s 从头开始编写MD。滑块菜单将在ContentPage
页面内动态创建。还在想这个……
@Don Box 你有解决方案吗?我也有同样的问题。?
【参考方案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。
【讨论】:
以上是关于分配 App.MainPage 时 MasterDetailPage 上缺少菜单按钮的主要内容,如果未能解决你的问题,请参考以下文章