在 MAUI 中应优先使用 Shell.Current.GoToAsync("..") 触发返回,它安全模拟系统返回行为并恢复上页状态;Android 需重写 OnBackButtonPressed 并调用该方法;避免直接操作 NavigationStack;返回首页等可使用 GoToAsync("//RouteName") 清空堆栈。
在 MAUI 中触发返回操作,主要依赖 Shell 提供的导航机制。如果你使用的是 Shell 结构(即 App 继承自 Shell,页面通过 ShellContent 或路由注册),推荐用 Shell 自带的返回方式,而不是手动操作导航堆栈。
这是最常用、最安全的方式,适用于绝大多数 Shell 导航场景:
Shell.Current.GoToAsync("..") 可模拟“返回”行为,等价于点击系统返回按钮或导航栏左上角箭头OnAppearing)在 Android 上,用户可能按物理/虚拟返回键。你需要在页面中重写 OnBackButtonPressed 并返回 true 表示已处理:
ContentPage 子类中重写:protected override bool OnBackButtonPressed() {
Shell.Current.GoToAsync("..");
return true; // 阻止默认行为
}
false,系统将退出应用(除非你做了全局拦截)虽然 Shell.Current.Navigation.PopAsync() 在技术上可行,但不建议在 Shell 应用中直接调用:
ShellNavigationManager 管理,绕过它可能导致状态不一致(如 TabBar 选中项错乱、路由参数丢失)PushAsync 推入的(非 Shell 路由方式)如果需要“返回到首页”或某个固定页面并清空中间页:
GoToAsync("//RouteName")(双斜杠表示绝对路由,自动清空堆栈)Shell.Current.GoToAsync("//MainPage") 会跳转到注册为 MainPage 的路由,并移除所有中间页面AppShell.xaml.cs 中通过
Routing.RegisterRoute 注册基本上就这些。Shell 的返回本质是路由回退,优先走 GoToAsync(".."),配合好 OnBackButtonPressed 就能覆盖所有常见场景。