我正在编写WPF应用程序并使用Prism和Unity在屏幕之间导航。我遇到的问题是我的屏幕有不同的区域布局。
例如(请参见图像),第一个屏幕有2个区域(区域1和区域2),当用户点击按钮时,它导航到仅有1个区域(区域3)的第2个屏幕。
我无法让它发挥作用。我也尝试隐藏区域2,并将第二个屏幕注入区域1.它隐藏了区域2,但不会将其折叠。所以右边有一个很大的空白区域。
我在Stack Overflow上发现这个article表示在Shell.xaml文件中有区域,并创建另一个区域来显示多区域布局。
所以我的 Shell.xaml 文件如下所示:
<ContentControl prism:RegionManager.RegionName="{x:Static inf:RegionNames.ShellMainRegion}" />
我在实现IModule接口的类的Initialize方法中注册区域,查看模型和视图。
_container.RegisterType<IRegion1And2ViewModel, Region1And2ViewModel>();
_container.RegisterType<IRegion1And2View, Region1And2View>();
_container.RegisterType<IRegion1ViewModel, Region1ViewModel>();
_container.RegisterType<IRegion1View, Region1View>();
_container.RegisterType<IRegion2ViewModel, Region2ViewModel>();
_container.RegisterType<IRegion2View, Region2View>();
_container.RegisterType<IRegion3ViewModel, Region3ViewModel>();
_container.RegisterType<IRegion3View, Region3View>();
IRegion shellMainRegion = _regionManager.Regions[RegionNames.ShellMainRegion];
var region1And2VM = _container.Resolve<IRegion1And2ViewModel>();
IRegionManager region1And2RegionManager = shellMainRegion.Add(region1And2VM.View);
IRegion region1 = region1And2RegionManager.Regions[RegionNames.Region1];
IRegion region2 = region1And2RegionManager.Regions[RegionNames.Region2];
var region1VM = _container.Resolve<IRegion1ViewModel>();
var region2VM = _container.Resolve<IRegion2ViewModel>();
region1.Add(region1VM.View);
region2.Add(region2VM.View);
region1.Activate(region1VM.View);
var region3VM = _container.Resolve<IRegion3ViewModel>();
shellMainRegion.Add(region3VM.View);
当我运行应用程序时,它显示第一个屏幕正常(区域1和2)。 但是,当我单击按钮并调用以下代码时,区域1和2布局仍然存在,区域1视图不再显示,区域3视图(应显示在shell主区域中)根本不显示
IRegion shellMainRegion = _regionManager.Regions[RegionNames.ShellMainRegion];
shellMainRegion.RequestNavigate(typeof(Region3View).Name);
有人可以向我展示使用Prism和Unity显示不同区域布局的屏幕所需的代码吗?
谢谢
答案 0 :(得分:0)
首先,您应该使用最新版本的Prism,此时为6.3。您在问题中包含的链接适用于旧版本,并且不再受支持。最新的位可以在这里找到:https://github.com/PrismLibrary/Prism。您可以通过NuGet将最新版本添加到项目/解决方案中。
现在问题,导航。您似乎在为执行_regionManager
调用而编写的代码中引用了区域管理器(RequestNavigate
)。但是,你没有正确使用。不要抓取对ShellMainRegion
的引用,只需从区域管理器调用RequestNavigate
方法即可。
_regionManager.RequestNavigate(RegionNames.ShellMainRegion, typeof(Region3View).Name);
这样做是告诉区域经理找到shell区域,并在其中显示Region3View
。
所以,这行代码:
IRegion shellMainRegion = _regionManager.Regions[RegionNames.ShellMainRegion];
不再需要。
希望这会帮助你!