从MasterDetailPage内按钮跳转,如何在其内部显示目标页面
解决MasterDetailPage内按钮跳转页面的问题
兄弟,你遇到的问题其实是对Xamarin.Forms里导航逻辑的理解偏差,我给你捋清楚关键点:
首先说为啥你之前的两种方法都不对:
- 用
Navigation.PushModalAsync():模态页面本身就是设计成全屏覆盖当前所有页面的,它不属于MasterDetailPage的内部导航栈,所以肯定会把整个MasterDetailPage盖住,这是模态跳转的正常行为,不是bug。 - 新建
Pagina_Master()实例:你新创建的这个对象和当前正在屏幕上显示的MasterDetailPage完全是两个独立的东西,操作它的Detail自然不会影响当前界面,所以啥都不显示也很正常。
那正确的做法应该是操作当前已经显示的MasterDetailPage实例,把新页面加到它的Detail导航栈里,就和菜单跳转的逻辑完全一致:
正确的按钮点击事件代码
private async void YourButton_Clicked(object sender, EventArgs e) { // 获取当前应用的主页面(也就是你正在使用的MasterDetailPage实例) var currentMasterDetail = Application.Current.MainPage as MasterDetailPage; if (currentMasterDetail != null) { // 把Pagina_Dos加到Detail的导航栈中(用PushAsync,而非模态跳转) await currentMasterDetail.Detail.Navigation.PushAsync(new Pagina_Dos()); // 自动关闭侧边菜单 currentMasterDetail.IsPresented = false; } }
补充说明
如果你的MasterDetailPage的Detail没有被NavigationPage包裹(菜单能正常跳转的话,大概率已经是包裹状态了),或者你想直接替换当前Detail页面(这种方式会清空导航栈,无法返回上一页),也可以用这种写法:
currentMasterDetail.Detail = new NavigationPage(new Pagina_Dos()); currentMasterDetail.IsPresented = false;
核心逻辑就是:不要新建MasterDetailPage实例,也不要用模态跳转,直接操作当前已存在的那个MasterDetailPage的Detail导航栈就行,和菜单跳转的逻辑保持统一~
内容的提问来源于stack exchange,提问作者Carlos Aldair Orta
相关产品推荐
相关产品推荐

