Prism RegionManager Navigation 导航功能

官方文档 prismlibrary.com

这段时间写这个WPF啊,脱离了Prism MVVM还真有点玩不转,老老实实回归MVVM了,以后可能试试别的框架,总之他这个事件订阅功能确实是很好用,然后在Prism的RegionManager这一块折腾了很久

简单来说,这个IRegionManager是继承了RegionManager的一个类,它可以通过依赖注入的方式导航UserControl,相当于降低了代码的耦合度,便于维护

具体流程

在app.xaml.cs里重写RegisterTypes

1
2
3
4
5
6
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<ViewA>();
containerRegistry.RegisterForNavigation<ViewB>();
containerRegistry.RegisterForNavigation<ViewC>();
}

注册了这几个View

随后你需要在对应的xaml页面上写上Content Control

1
<ContentControl prism:RegionManager.RegionName="MainRegion"/>

需要声明好prism的命名空间,还要打开自动绑定View和ViewModel,这里把两个文件保存在两个目录里,名为Views和ViewModels,同时名字也是AView和AViewModel

1
xmlns:prism="http://prismlibrary.com/"

然后你得在后端的ViewModel里初始化IRegionManager

1
2
3
4
5
6
private readonly IRegionManager regionManager;

public MainViewModel(IRegionManager rm)
{
regionManager = rm;
}

随后进行导航

1
regionManager.Regions["MainRegion"].RequestNavigate("ViewA");

错误

我在导航这一步一直提示没有找到MainRegion这个Region名,我的依赖注入也是对的,不知道为什么谔谔,在后面修好了可能还会发

我使用一下方法来绕过这个问题:

1
regionManager.RegisterViewWithRegion("MainRegion", typeof(AView));

这一步相当于初始化了Content Control,随后可以导航

1
regionManager.RequestNavigate("MainRegion", "BViewView"); 

可能是我没有先注册吗?

浅谈我在折腾子窗口时的想法

原本设想的是弹出一个新窗口之后两个窗口一起去处理事情,但是貌似在MVVM的设计中,没有查到什么相关的文章;MVVM设计貌似更偏向于使用导航的方式去处理各种页面,以后进一步去研究