我正在使用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应用程序,单击“列表”,单击左侧的任何项目。单击后退按钮,您应该会看到我的问题。
答案 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;
}