如何使用Prism和Unity导航到不同的区域布局?

时间:2017-04-15 11:25:55

标签: c# wpf mvvm unity-container prism

我正在编写WPF应用程序并使用PrismUnity在屏幕之间导航。我遇到的问题是我的屏幕有不同的区域布局。

例如(请参见图像),第一个屏幕有2个区域(区域1和区域2),当用户点击按钮时,它导航到仅有1个区域(区域3)的第2个屏幕。 enter image description here

我无法让它发挥作用。我也尝试隐藏区域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显示不同区域布局的屏幕所需的代码吗?

谢谢

1 个答案:

答案 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];

不再需要。

希望这会帮助你!