用途:在 .NET MAUI 应用中用 Shell 实现页面导航。Shell 提供基于 URI 的导航、浮出菜单、标签栏和四级视觉层次,全部通过 XAML 声明式配置。
适用:配置带标签或浮出菜单的顶层导航;用 GoToAsync 以代码方式跳转;通过查询参数或对象参数在页面间传数据;为不在视觉层次中的详情页注册路由;用确认对话框拦截导航(如未保存修改);按页面自定义返回按钮。不适用:外部 URL 深链接、导航目标页的数据绑定、页面与视图模型的依赖注入、未使用 Shell 的 NavigationPage 应用。
视觉层次:Shell → FlyoutItem/TabBar(顶层分组)→ Tab(底部标签分组)→ ShellContent(指向 ContentPage)。多 ShellContent 生成顶部标签。可省略中间包装,Shell 会自动包裹。
用法要点:AppShell.xaml 继承 Shell;用 ContentTemplate 配合 DataTemplate 按需创建页面,避免启动时构造全部页面;为每个 ShellContent 显式设置 Route(否则自动生成 D_FAULT_ 形式且不稳定的路由);在 AppShell 构造函数中用 Routing.RegisterRoute 注册详情页路由;导航统一用 await Shell.Current.GoToAsync,支持 // 绝对、相对、.. 返回等前缀;接收参数优先用 IQueryAttributable(放在视图模型上),或用 [QueryProperty];传整个对象用 ShellNavigationQueryParameters;异步拦截导航用 OnNavigating 中 args.GetDeferral() 与 deferral.Complete();检测返回导航检查 e.Source == ShellNavigationSource.Pop。还可配置 TabBar 外观、FlyoutBehavior、FlyoutDisplayOptions、MenuItem 与 BackButtonBehavior。
限制与常见陷阱:路由名必须全局唯一,重复会抛 ArgumentException;未注册的相对路由调用 GoToAsync 会在运行时抛错;绝对路由路径必须与视觉层次完全匹配,否则静默无操作;不 await GoToAsync 会造成竞态和静默失败;导航栈只读,不能直接操作 Tab.Stack。资料未提供收费、价格与平台信息。