前言
在之前系列文章《Region的用法》中,我提到无法在子窗口中实现区域管理,最近经过尝试发现其实是可以的,只是少了一个步骤而已!Region具体细节还请参考这篇。
【Prism系列】Region的用法_prism region_code bean的博客-CSDN博客Prism中的Region可以和WPF中提供的Frame进行类比,Frame通过加载不同的Page达到界面导航的效果。Region也有相同的作用,不过Region有Psrim框架以及容器的加持,能够支持更细致化的导航控制,更轻松的传参, 更方便的生命周期管理,以及提供更加松的耦合,等等。Region的整个套路和上一篇文章《》有着很多共同之处,大家可以对照学习。.........https://blog.csdn.net/songhuangong123/article/details/126587552#:~:text=%E5%8F%91%E5%B8%83-,%E3%80%90Prism%E7%B3%BB%E5%88%97%E3%80%91Region%E7%9A%84%E7%94%A8%E6%B3%95,-code%20bean
正文
首先我先新建一个子窗口,就叫 PluginBaseWindow 吧。然后再子窗口中也放置一个区域:
这个和之前的在主窗口中步骤是一模一样的。然后通过 子窗口中的OK按钮实现子窗口的区域切换:
OKCmd = new DelegateCommand(() =>
{
regionManager.RequestNavigate("BaseRegion", "TestView");
});
截至到这里,和之前的操作没有任何的区域,但是子窗体中就是无法实现Region的管理,无法切换界面。
少了的步骤
和主窗体不同,子窗体我们需要额外的步骤:也就是在打开子窗体之前我们需要加上:
//从容器中获取region管理器
var regionManager = ContainerLocator.Container.Resolve<IRegionManager>();
var provider = ContainerLocator.Container.Resolve<IContainerProvider>();
//通过provider新建一个PluginBaseWindow类型窗口
var win = provider.Resolve<PluginBaseWindow>();
//通过region管理器注册这个子窗口对象
RegionManager.SetRegionManager(win, regionManager);
然后再打开子窗口,此时就会发现,子窗体能实现Region的管理了。但是当你关闭子窗口,然后再打开时,会发现又报错了:
An exception occurred while creating a region with name 'BaseRegion'. The exception was: System.ArgumentException: Region with the given name is already registered: BaseRegion
他说,BaseRegion已经注册了!这个BaseRegion是子窗口中划分的Region管理区域,其实我们在通过注册窗口时完成的,这个函数会自动识别里面的区域,然后进行注册。
//通过region管理器注册这个子窗口对象
RegionManager.SetRegionManager(win, regionManager);
所以不用疑惑 :我没有注册BaseRegion呀,为啥说我注册了呢?那其实是上面这段代码完成的。
所以我们在关闭窗口之后,在加上一句:
//由于在弹窗服务当中设置区域, 在窗口再次打开的同时会提示区域名称已注册的问题,
//则你需要在关闭前移除原有的所有区域名即可。
regionManager.Regions.Remove("BaseRegion");
就能解决报错问题。
反思
那为啥,主窗口比子窗口少了这个步骤呢?接下来也只是我的猜想。
回想一下我们在构建prsim程序的时候,是不是直接返回了一个主窗体给容器!
那估计就是在这里,prism框架帮我们做了这个事情,所以就不需要了。而我们自己打开子窗口就需要自己做这个事情了!
那为啥主窗体不用 Remove Region?那当然是因为主窗体关闭程序就退出了呀~~~