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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:22:05