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 全局导航处理器,统一拦截所有导航请求做校验:
- 实现全局导航拦截器
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(); } }
- 在
App.xaml.cs的RegisterTypes方法中注册拦截器即可生效:
containerRegistry.RegisterSingleton<INavigationProcessingHandler, GlobalAuthNavigationFilter>();
方案说明
两个方案都是Prism官方提供的标准扩展点,完全兼容7.2及后续版本,不需要修改Prism核心逻辑,也不会出现页面提前渲染的问题。你之前考虑的重写NavigationService、延时跳转的方案都不需要采用。
内容的提问来源于stack exchange,提问作者bares43
相关产品推荐
相关产品推荐

