You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET MAUI Shell导航能否将选项卡页压入当前页保留导航栈

问题根因

.NET MAUI Shell 根节点下直接定义的TabBar属于顶层根导航单元,本身就不支持相对路由压栈访问。你用//Annotation这种双斜杠开头的绝对路由跳转,本质是直接切换Shell的根导航节点,默认行为就是清空现有导航栈,不可能保留之前的页面层级,这是Shell导航的设计规则,不是配置错误。

可落地方案

根据你的交互需求二选一即可:

方案1:Tab页作为子页面压入导航栈(符合你要保留导航层级的需求)

不要把带底部选项卡的页面挂在Shell根级TabBar节点下,单独用TabbedPage做选项卡容器,注册普通路由后用相对路由跳转,就会自动压入当前导航栈,按返回键可直接回到上一级页面。
步骤如下:

  1. 把AppShell.xaml里根节点下的整个<TabBar Route="Annotation">...</TabBar>代码块全部删除,Shell根节点只保留MainPage对应的ShellContent即可。
  2. 新建名为AnnotationTabPage的页面,继承自TabbedPage,把原来三个选项卡对应的子页面挂到这个容器页下:
<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
            xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
            xmlns:view="clr-namespace:MauiApp1.Views"
            x:Class="MauiApp1.Views.AnnotationTabPage"
            Title="Annotation">
    <view:ShapePage Title="Shape" />
    <view:CalloutPage Title="Callout" />
    <view:SignPage Title="Sign" />
</TabbedPage>
  1. 在AppShell.xaml.cs构造函数中注册这个普通路由,不需要在XAML根节点挂载:
public AppShell()
{
    InitializeComponent();
    // 注册非根级路由,支持压栈导航
    Routing.RegisterRoute(nameof(AnnotationTabPage), typeof(AnnotationTabPage));
}
  1. 修改按钮点击事件的跳转逻辑,去掉双斜杠前缀用相对路由跳转即可:
private async void Button_Clicked(object sender, EventArgs e)
{
    // 相对路由导航,不会清空原有导航栈
    await Shell.Current.GoToAsync(nameof(AnnotationTabPage));
}

说明:这个方案下底部选项卡只会在AnnotationTabPage及其子页面显示,返回MainPage时会自动隐藏,完全符合普通页面压栈的交互逻辑。

方案2:Tab栏作为全局一级导航

如果Annotation模块本身就是App的一级入口,不需要压栈返回,那你现在用绝对路由跳转的写法本身就是官方推荐的正确实现,导航栈清空是预期行为。这种场景下不要做压栈处理,直接把MainPage也加到根TabBar里作为第一个Tab即可,用户点Tab就能切回首页,不需要返回按钮。


内容的提问来源于stack exchange,提问作者Jason Huang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:15:44