Xamarin+Prism:如何在TabbedPage内导航并保留宿主标签页?
标签页内导航实现方案(Xamarin 4.4 + Prism 7.2)
核心逻辑
要保留TabbedPage不消失,必须让导航操作在当前标签页的独立导航栈内进行,而非替换整个根导航栈。
具体实现步骤
1. 给TabbedPage子页面套上NavigationPage
修改你的TabbedPage XAML,将HomePage包装在NavigationPage中,让每个标签页拥有自己的导航栈:
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:views="clr-namespace:LogiStock.UI.Base.Views" x:Class="Views.TabbedPage1" > <NavigationPage Title="AA"> <x:Arguments> <views:HomePage x:Name="Test"/> </x:Arguments> </NavigationPage> <!-- 其他标签页同样用NavigationPage包装 --> </TabbedPage>
2. 使用Prism相对导航跳转
在HomePage对应的ViewModel中,用相对路径发起导航,指定在当前标签页的导航栈内跳转:
// 跳转到目标页面(示例为DetailPage) await NavigationService.NavigateAsync("DetailPage", useModalNavigation: false);
需要传参的话,直接在路径后拼接参数:
await NavigationService.NavigateAsync("DetailPage?itemId=456", useModalNavigation: false);
3. 禁止使用绝对路径替换根栈
不要用类似NavigationService.NavigateAsync("/TabbedPage1/DetailPage")的绝对导航路径,这种操作会直接替换整个根导航栈,导致TabbedPage被覆盖。
4. 返回上一页的处理
直接调用Prism的返回方法,会自动操作当前标签页的导航栈:
await NavigationService.GoBackAsync();
额外注意事项
- 所有页面必须在Prism的
RegisterTypes方法中完成注册:
protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation<HomePage>(); containerRegistry.RegisterForNavigation<DetailPage>(); containerRegistry.RegisterForNavigation<TabbedPage1>(); }
- 不要使用模态导航(
useModalNavigation设为false),模态弹窗会暂时隐藏TabbedPage。
内容的提问来源于stack exchange,提问作者Alexandre S.
相关产品推荐
相关产品推荐

