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/
- Windows:
- 验证页面继承关系:确认
ForgotPasswordPage及所有路由关联页面都正确继承自ContentPage(或Shell兼容的页面类型),非合规页面会导致路由注册静默失败。 - 添加调试代码排查:
- 输出已注册路由列表,确认路由是否真的被加载:
foreach (var route in Routing.Routes) { System.Diagnostics.Debug.WriteLine($"已注册路由:{route.Key} -> {route.Value}"); } - 给构造函数加异常捕获,排查依赖注入是否触发未捕获异常,导致路由注册代码未执行:
try { BindingContext = App.Container.Resolve<AppShellViewModel>(); // 路由注册代码... } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"构造函数异常:{ex.Message}"); }
- 输出已注册路由列表,确认路由是否真的被加载:
内容的提问来源于stack exchange,提问作者Stefan Vukovic
相关产品推荐
相关产品推荐

