Xamarin:MasterDetailPage详细信息中的后退按钮

时间:2016-08-22 08:38:45

标签: xamarin uwp back-button master-detail

我正在使用Xamarin.Forms 2.3.1.114来构建跨平台应用。我开始使用UWP应用程序,现在正在调试桌面应用程序。

这是当前的导航路径:

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

MasterDetailPage:

- > Master(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页面包装在Navigation页面中,但是这会阻止显示后退按钮,这显然是由于NavigationPage声称导航堆栈或沿着这些行的某些内容引起的。我也试过使Detail页面继承自NavigationPage而不是ContentPage,结果相同。

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

这是显示此行为的项目。

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

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

1 个答案:

答案 0 :(得分:0)

  

当在详细信息页面上时,后退按钮将我带回主菜单内容页面,而不是主页面,这将是我眼中的预期行为。实现此行为的目的是什么?

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

Xamarin Master Detail页面的默认行为无法满足您的全部要求。

此方案中的正确方法是使用Navigation.PushAsync。此方法异步将Page添加到导航堆栈的顶部。

  

在ItemSelected事件中推送详细信息页面实例会导致执行,因为其Parent属性已设置。

看起来你已经在xaml

中绑定了MasterDetailPage的Detail属性
  <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