Xamarin.Forms-Master/DetailPagesandNavigationHistoryIssues我有一个应用程序,它使用master-detail页面在所有页面上显示菜单。在我的应用程序中,导航以两种方式发生。一个来自菜单,另一个来自仪表板。因此,如果我导航到另一个页面,然后按“后退”按钮,它会关闭应用程序。它不记得导航历史。master详情页如下:publicclassRootPage:MasterDetailPage{publicRootPage(){varmenuPage=newMenuPage();menuPage.Menu.ItemSelected+=(sender,e)=>NavigateTo(e.SelectedItemasMenuItem);Master=菜单页面;Detail=newNavigationPage(newContractsPage());}voidNavigateTo(MenuItemmenu){PagedisplayPage=(Page)Activator.CreateInstance(menu.TargetType);Detail=newNavigationPage(displayPage);IsPresented=false;那么任何想法如何克服这个问题?正如@Sten-Petrov所说:您正在替换详细信息页面而不是触发历史记录机制。要触发历史记录机制,您需要在详细信息页面的导航属性上执行PushAsync(Page)。在您的示例中,更改NavigateTo:voidNavigateTo(MenuItemmenu){PagedisplayPage=(Page)Activator.CreateInstance(menu.TargetType);Detail.Navigation.PushAsync(displayPage);这不会替换内容,但会打开一个具有所需后退按钮功能的新页面。如果你想使用Master-Detail页面的后退按钮功能,那么你需要自定义后退堆栈过程,这在我看来是不值得的。在这种情况下,只需移动到不同的页面/导航结构。这里的问题是您没有使用导航堆栈来执行页面转换,而是替换了您自己页面上的项目,因此除了您导航到MasterDetailPage的页面之外,没有导航历史可以“返回”。您可以通过创建一个继承MasterDetailPage的新MenuMasterDetail.cs类并初始化菜单来解决此问题,然后创建一个继承自公共基础的MenuItem_A_Page.xaml(或.cs),并在您将使用Navigation.PushAsync()时添加它。..)在公共基类Navigation.PushAsync(...)中在页面之间转换。基类:publicclassMenuDetailPage:MasterDetailPage{publicMenuDetailPage():base(){this.Master=BuildMyMenuListHere();//菜单项也将定义导航目标}}CS中的子类:publicclassFirstDetailWithMenuPage:MenuDetailPage{publicFirstDetailWithMenuPage():base()//这创建了菜单{this.Detail=newStackLayout{//改变它但是你需要Children={newLabel{Text="Thisisthefirstpage"},newButton{Text="Ok"},}}}XAML中的子类(和上面的CS,减去设置Detail的部分):...还更新您的App.cs以返回包含页面导航页面(而非基页)的第一个主/详细信息:我有同样的问题,Detail.Navigation.PushAsync(itemSelected)使汉堡包菜单消失,同时创建另一个子类以保留代码和性能方面的大量工作。因此,我决定为主详细信息页面使用我自己的堆栈数据类型。跟踪和编码有点棘手,但工作正常。使用当前详细信息页面在应用程序加载时对其进行初始化,并为每个选定的项目在堆栈顶部推送一个新页面。publicpartialclassMyMasterDetailPage:MasterDetailPage{privateStacknavigationStack=newStack();publicMyMasterDetailPage(){InitializeComponent();navigationStack.Push(细节);尝试{masterPage.listView.ItemSelected+=OnItemSelected;}catch(Exception){System.Diagnostics.Debug.WriteLine(exc.Message);}}同页代码后面重写OnBackButtonPressed()大家有用,需要多了解C#学习教程,希望大家多多关注—protectedoverrideboolOnBackButtonPressed(){try{varlastPage=navigationStack.Pop();如果(lastPage.Equals(Detail))lastPage=navigationStack。流行音乐();详细信息=(Page)lastPage;IsPresented=false;//避免应用程序在完成弹出和新页面被推到它上面时关闭if(navigationStack.Count==0)navigationStack.Push(Detail);返回真;}catch(Exception){returnbase.OnBackButtonPressed();}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
