2016-08-22 93 views
0

我使用Xamarin.Forms 2.3.1.114来构建跨平台的应用程序。我从UWP应用程序开始,现在调试为桌面应用程序。Xamarin:详细的MasterDetailPage后退按钮

这是当前的导航路径:

主菜单(ContentPage) - >内容(MasterDetailPage)

MasterDetailPage:

- >主站(ContentPage)包含经由ListView中示出的项目的列表

- >详细(ContentPage)从一个单一的列表项

的Xamarin文档显示数据说:

详细信息页面通过将MasterDetailPage.IsPresented属性设置为false呈现给用户。

https://developer.xamarin.com/guides/xamarin-forms/user-interface/navigation/master-detail-page/

所以,我提出在母版页的公共ListView控件,并添加代码类同以下的MasterDetailPage:

public MyMasterDetailPage() 
{ 
    this.Master.ItemsListView.ItemSelected += MasterListView_ItemSelected; 
} 

private void MasterListView_ItemSelected(object sender, SelectedItemChangedEventArgs e) 
{ 
    if (this.Master.ItemsListView.SelectedItem == null) 
    { 
     return; 
    } 

    this.Detail.BindingContext = this.Master.ItemsListView.SelectedItem; 

    this.IsPresented = false; 
} 

详细信息页面显示所选项目的详细信息,所以这工作正常。

但是,有一个后退按钮显示。在详细信息页面上,后退按钮将我带回主菜单内容页面,而不是主页面,这将成为我眼中的预期行为。什么是实现这种行为的预期方式?

这里是我试过:

当然,这种行为是因为详细信息页面没有被压入导航堆栈。在ItemSelected事件中推送那里的Detail页面实例会导致一个exeption,因为它的Parent属性已经设置。

我试过在设置MasterDetailPage的Detail属性时在导航页面中包装了Detail页面,但是这样可以防止后退按钮显示,这显然是由导航声明导航堆栈或沿着这些行的东西导致的。我也试着让DetailPage继承自NavigationPage而不是ContentPage,结果相同。

我不确定我是否在这里寻找正确的东西,在我看来,就像我对MasterDetailPages应该被使用的方式有一些误解。任何帮助表示赞赏。

这是显示此行为的项目。

https://1drv.ms/u/s!At78FKXjEGEohocQQgxaZuCYT2rwMw

启动UWP应用程序,点击“列表”,点击左侧的任何项目。点击后退按钮,你应该看到我的问题。

+0

丹尼尔你好,你说的是当前的代码,使后退按钮可见,你是怎么做的?任何演示将有助于理解您的问题。如果您选择MasterDetailPage,则使用导航页面来适合您的场景 –

+0

您好富兰克林,我在帖子的末尾添加了一个有问题项目的链接,详细信息页面应该只填充TabbedPage,NavigationPage和ContentPage实例。我没有做任何特别的事情来让后退按钮显示出来,由于存在导航堆栈,它必须是自动的。 –

回答

0

当处于详细信息页面时,后退按钮将我带回主菜单内容页面,而不是Master页面,这将成为我眼中的预期行为。什么是实现这种行为的预期方式?

是的,你的假设是正确的,这是由于导航返回堆栈中缺少特定的页面。

Xamarin Master Detail页面的默认行为无法实现您的完整需求。

在这种情况下正确的方法是使用Navigation.PushAsync。此方法将页面异步添加到导航堆栈的顶部。

因为它的Parent属性已经设置,所以在ItemSelected事件中推送那里的Detail页面实例会导致一个exeption。

看起来你已经assinged MasterDetailPage的详细属性在XAML

<MasterDetailPage.Detail> 
    <pages:LeadDetailPage /> 
    </MasterDetailPage.Detail> 

请直接添加ContentPage堆栈,这将正确地让你的导航。

使用在LeadsMainPage.xmal.cs文件下面的代码:

private void LeadsList_ItemSelected(object sender, SelectedItemChangedEventArgs e) 
{ 
      if (_masterPage.LeadsList.SelectedItem == null) 
      { 
       return; 
      } 

      ContentPage detailpage = new LeadDetailPage(); 
      detailpage.BindingContext= _masterPage.LeadsList.SelectedItem; 
      Navigation.PushAsync(detailpage); 

      this.IsPresented = false; 
} 

截图: enter image description here

+0

谢谢,这当然有效。但有几件事情:使用这种方法我根本没有看到任何理由使用MasterDetailPage。另外,一旦我到达其他平台(这是iOS上默认的我认为的),左右划像在Master和Detail之间切换的行为将不再起作用。我假设MasterDetailPage将所有这些主要细节行为带到同一页面下,但感觉这根本不是它的目的。那么使用MasterDetailPage的正确场景究竟是什么,如果不是我现在的那个? –

+1

根据我的经验,MasterDetailPage的行为有点像[UWP中的汉堡菜单](https://blogs.msdn.microsoft.com/quick_thoughts/2015/06/01/windows-10-splitview-build-your -first-hamburger-menu /),但通过使用SplitView控件,汉堡菜单支持左上角标题栏上的导航后退按钮。在Xamarin中,它没有添加这种情况的支持。 UWP中常用的方法Template10是推荐模板:https://github.com/Windows-XAML/Template10/wiki –