.NET MAUI中如何为Shell导航添加登录校验并拦截项点击?
.NET MAUI Shell导航拦截+登录校验实现方案
针对你的需求,我们可以通过Shell导航事件拦截结合登录状态校验来实现,以下是具体步骤和代码示例:
1. 给目标ShellContent配置路由
先给VideoChatPage对应的ShellContent指定路由,方便后续精准拦截:
<FlyoutItem> ... <ShellContent Title="Video Chat" Icon="{StaticResource IconVideoChat}" ContentTemplate="{DataTemplate videoChat:VideoChatPage}" FlyoutItemIsVisible="False" IsVisible="{Binding IsVideoChatVisible}" Route="VideoChat" /> <!-- 添加路由 --> ... </FlyoutItem>
2. 订阅Shell的Navigating事件做拦截
在AppShell的构造函数中订阅Navigating事件,在事件处理方法中完成登录校验逻辑:
public AppShell() { InitializeComponent(); // 订阅导航事件 Shell.Current.Navigating += OnShellNavigating; } private async void OnShellNavigating(object sender, ShellNavigatingEventArgs e) { // 匹配目标路由:检查是否是跳转到VideoChat页面 if (e.Target.Location.OriginalString.Equals("//VideoChat", StringComparison.OrdinalIgnoreCase)) { // 获取全局登录状态(这里假设你用CommunityToolkit.Mvvm的全局ViewModel管理登录状态) var appVm = Ioc.Default.GetService<AppViewModel>(); if (!appVm.IsLoggedIn) { // 取消默认导航行为 e.Cancel(); // 弹出登录确认弹窗 var loginConfirm = await Shell.Current.DisplayAlert("权限提示", "进入视频聊天需要先登录", "去登录", "取消"); if (loginConfirm) { // 用户选择登录,跳转到登录页面 await Shell.Current.GoToAsync("//Login"); } // 用户取消则不做任何操作 } } }
3. 结合CommunityToolkit.Mvvm处理登录后跳转
在你的登录ViewModel中,完成登录逻辑后手动触发跳转到VideoChatPage:
public partial class LoginViewModel : ObservableObject { [ObservableProperty] private string username; [ObservableProperty] private string password; // 注入全局AppViewModel获取登录状态 private readonly AppViewModel _appVm; public LoginViewModel(AppViewModel appVm) { _appVm = appVm; } [RelayCommand] public async Task Login() { // 模拟登录校验逻辑 if (!string.IsNullOrEmpty(Username) && !string.IsNullOrEmpty(Password)) { _appVm.IsLoggedIn = true; // 登录成功后跳转到视频聊天页面 await Shell.Current.GoToAsync("//VideoChat"); // 关闭登录页面 await Shell.Current.Navigation.PopModalAsync(); } else { await Shell.Current.DisplayAlert("错误", "请输入正确的账号密码", "确定"); } } }
补充说明
- 如果你的登录状态是通过本地存储(比如SecureStorage)维护的,可以在
AppShell初始化时先读取状态,避免每次都依赖ViewModel - 若需要更通用的拦截逻辑,可以封装一个导航服务,统一处理所有需要登录校验的页面路由
内容的提问来源于stack exchange,提问作者David Shochet
相关产品推荐
相关产品推荐

