Prism 7.2+微软DI下RegionManager无区域,视图功能失效如何解决?
解决Prism + MS DI下RegionAdapterMappings为空及视图功能失效问题
我之前也碰到过一模一样的情况,在Prism 7.2搭配.NET Core 3.1的WPF应用里用MS DI时,默认的区域适配器映射经常没正确注册到容器,直接导致视图发现、注入功能彻底罢工。结合你给出的代码,咱们可以这样调整来解决问题:
1. 先注册必要的区域适配器类型
在RegisterRequiredTypes方法里,得把Prism默认的区域适配器先注册到容器,这样后面才能解析它们配置映射:
protected override void RegisterRequiredTypes(IContainerRegistry containerRegistry) { base.RegisterRequiredTypes(containerRegistry); containerRegistry.RegisterSingleton<IRegionNavigationContentLoader, RegionNavigationContentLoader>(); containerRegistry.RegisterSingleton<IServiceLocator, MicrosoftServiceLocatorAdapter>(); // 添加以下三行,注册Prism默认的区域适配器 containerRegistry.Register<ContentControlRegionAdapter>(); containerRegistry.Register<ItemsControlRegionAdapter>(); containerRegistry.Register<SelectorRegionAdapter>(); }
2. 配置区域适配器映射并注册到容器
接下来在ConfigureRegionAdapterMappings方法中,除了把映射实例注册到容器,还要给常用的WPF控件绑定对应的适配器,这样RegionManager才能识别这些控件作为区域容器:
protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings) { base.ConfigureRegionAdapterMappings(regionAdapterMappings); // 获取MS DI容器实例 var container = PrismContainerExtension.Current.GetContainer(); // 为常用控件注册区域适配器映射 regionAdapterMappings.RegisterMapping(typeof(ContentControl), container.GetService<ContentControlRegionAdapter>()); regionAdapterMappings.RegisterMapping(typeof(ItemsControl), container.GetService<ItemsControlRegionAdapter>()); regionAdapterMappings.RegisterMapping(typeof(Selector), container.GetService<SelectorRegionAdapter>()); // 将映射实例注册到容器,确保RegionManager能正确获取到 PrismContainerExtension.Current.RegisterInstance(regionAdapterMappings); }
3. 额外注意事项
- 确保你的视图已经正确注册到容器中(比如用
containerRegistry.Register<MyView>()),视图发现功能依赖容器能正常解析视图类型。 - 如果用
IRegionManager.RegisterViewWithRegion手动注入视图,要保证区域名称和XAML中RegionManager.RegionName属性的值完全一致,大小写都不能错。 - 关于
requiresRebuild参数:这个参数在调用容器重建方法时,如果设为true,会销毁容器内所有已注册的实例并重建容器,一般只在开发环境需要重置容器状态时使用,生产环境尽量避免,防止意外丢失实例状态。
调整完这些之后,RegionManager就能正常识别区域,视图发现和注入功能应该就能正常工作了。
内容的提问来源于stack exchange,提问作者a bouaz
相关产品推荐
相关产品推荐

