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

Prism 7.2移除OnNavigatingTo后如何实现满足条件时跳转页面

方案1:单页面校验(适用于仅部分页面需要校验的场景)

Prism 7.2 官方提供了 IConfirmNavigationAsync 接口作为原 OnNavigatingTo 方法的替代,该接口的 CanNavigateAsync 方法会在导航到目标页之前触发,返回 false 即可直接终止当前导航流程,不会出现页面提前渲染的问题,示例代码如下:

public class DemoPageViewModel : IConfirmNavigationAsync
{
    private readonly INavigationService _navigationService;

    public DemoPageViewModel(INavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    public async Task<bool> CanNavigateAsync(INavigationParameters parameters)
    {
        // 跳过登录页、授权页本身的校验,避免循环跳转
        // 校验登录状态
        if (!IsUserLogined())
        {
            await _navigationService.NavigateAsync("LoginPage");
            return false;
        }
        // 校验协议有效期
        if (IsAgreementExpired())
        {
            await _navigationService.NavigateAsync("AgreementPage");
            return false;
        }
        // 校验通过,允许导航到当前页
        return true;
    }
}

方案2:全局校验(适用于绝大多数页面需要统一校验的场景)

如果你的登录、协议校验是全局通用逻辑,不需要每个ViewModel单独实现,可以用Prism提供的 INavigationProcessingHandler 全局导航处理器,统一拦截所有导航请求做校验:

  1. 实现全局导航拦截器
public class GlobalAuthNavigationFilter : INavigationProcessingHandler
{
    private readonly INavigationService _navigationService;

    public GlobalAuthNavigationFilter(INavigationService navigationService)
    {
        _navigationService = navigationService;
    }

    public async Task<NavigationRequestResult> ProcessRequestAsync(INavigationRequest request, NavigationRequest nextHandler)
    {
        var targetVmType = request.Context.TargetViewModelType;
        // 排除不需要校验的页面,避免循环跳转
        if (targetVmType != typeof(LoginPageViewModel) && targetVmType != typeof(AgreementPageViewModel))
        {
            if (!IsUserLogined())
            {
                await _navigationService.NavigateAsync("LoginPage");
                return NavigationRequestResult.Cancel();
            }
            if (IsAgreementExpired())
            {
                await _navigationService.NavigateAsync("AgreementPage");
                return NavigationRequestResult.Cancel();
            }
        }
        // 校验通过,继续执行导航
        return await nextHandler();
    }
}
  1. 在 App.xaml.cs 的 RegisterTypes 方法中注册拦截器即可生效:
containerRegistry.RegisterSingleton<INavigationProcessingHandler, GlobalAuthNavigationFilter>();

方案说明

两个方案都是Prism官方提供的标准扩展点,完全兼容7.2及后续版本,不需要修改Prism核心逻辑,也不会出现页面提前渲染的问题。你之前考虑的重写NavigationService、延时跳转的方案都不需要采用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:54:04