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

Xamarin.Forms Routing.RegisterRoute()无法注册路由变更求助

问题描述

我在AppShell.xaml.cs中进行路由注册,代码如下:

public partial class AppShell : Shell
{
    public AppShell()
    {
        InitializeComponent();
        
        BindingContext = App.Container.Resolve<AppShellViewModel>();

        Routing.RegisterRoute(nameof(AdvertismentDetailViewModel), typeof(AdvertisementDetailPage));
        Routing.RegisterRoute(nameof(LoginViewModel), typeof(LoginPage));
        Routing.RegisterRoute(nameof(UserDetailViewModel), typeof(UserDetailPage));
        Routing.RegisterRoute(nameof(AdvertismentListViewModel), typeof(AdvertisementDetailPage));
        Routing.RegisterRoute(nameof(RegisterViewModel), typeof(RegisterPage));
        Routing.RegisterRoute(nameof(UserProfileViewModel), typeof(UserProfilePage));
        Routing.RegisterRoute(nameof(MyAdvertisementsListViewModel), typeof(MyAdvertisementsListPage));
        Routing.RegisterRoute(nameof(MyAdvertisementDetailViewModel), typeof(MyAdvertisementDetailPage));
        Routing.RegisterRoute(nameof(PublisherChatViewModel), typeof(PublisherChatView));
        Routing.RegisterRoute(nameof(YekkaDetailViewModel), typeof(YekkaDetailPage));
        Routing.RegisterRoute(nameof(ForgotPasswordViewModel), typeof(ForgotPasswordPage));
    }
}

现在无论新增路由还是删除全部路由,都无法生效。添加最后一条路由时发现该问题,已尝试重建项目、删除bin和obj文件夹,恳请帮助。

排查与解决方案
  • 调整路由注册顺序:把路由注册代码移到BindingContext赋值之前执行,避免依赖注入操作影响后续路由注册逻辑。
  • 检查路由名称与页面映射:注意到代码里AdvertismentListViewModel和AdvertismentDetailViewModel都指向AdvertisementDetailPage,虽不直接导致失效,但可能引发逻辑混淆,确认是否为笔误;同时核对所有路由名称的拼写(比如Advertisment和Advertisement的字母差异),确保跳转时使用的名称和注册完全一致。
  • 清理MAUI全局缓存:除了项目的bin/obj文件夹,手动删除系统级MAUI缓存:
    • Windows:C:\Users\[你的用户名]\AppData\Local\Xamarin\Cache
    • Mac:~/Library/Caches/Xamarin/
  • 验证页面继承关系:确认ForgotPasswordPage及所有路由关联页面都正确继承自ContentPage(或Shell兼容的页面类型),非合规页面会导致路由注册静默失败。
  • 添加调试代码排查:
    1. 输出已注册路由列表,确认路由是否真的被加载:
      foreach (var route in Routing.Routes)
      {
          System.Diagnostics.Debug.WriteLine($"已注册路由:{route.Key} -> {route.Value}");
      }
      
    2. 给构造函数加异常捕获,排查依赖注入是否触发未捕获异常,导致路由注册代码未执行:
      try
      {
          BindingContext = App.Container.Resolve<AppShellViewModel>();
          // 路由注册代码...
      }
      catch (Exception ex)
      {
          System.Diagnostics.Debug.WriteLine($"构造函数异常:{ex.Message}");
      }
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 13:10:28