prism框架学习:
背景
之前工作确实用到这个prism框架,但是由于一直陷在业务漩涡,没有精力来学习这个框架,最近听说我的梦中情厂用的大多都是这个框架,那必须抽时间把这个框架给好好学习一下,这里呢,更多的是为了做一个笔记,方便自己没事的时候看看,所以格式方面就比较随意,看官们见谅…
关于prism
通过gitlab介绍:链接: prism-githup官网 ,我们知道prism.core是平台无关的 但是prism没办法做到平台无关,所以针对wpf有prism.wpf,而prism.unity主要就是为了提供UnityContainer作为ioc容器,实现控制反转(依赖注入),所以本人使用的prism的库也就是prism.core prism.wpf prism.unity这三个。
如何开始一个prism项目
首先第一步,在启动程序更改appsettings.xaml文件
app.xaml中的类型换成prismApplication,并且移除startupUri,并且必须提供CreateShell和registerType的覆写方法
1.createshell 返回应用程序主窗口
2.registerTypes 在prism初始化过程中被调用,一般是定义一些注册类型,主要是为了实现控制翻转,所以预注册类型
注意:在将ViewModelLocator.AutoWireViewModel 附加属性设置为 True 的同时,Prism 首先查找 ViewModelLocationProvider 中已经使用 Register 注册的类型,如果没有的话,会按照命名规则找到对应的viewmodel(当然在app.xaml.cs也可以覆写SetDefaultViewTypeToViewModelTypeResolver方法更改对应的命名规则)
module
在prism的框架中,一个程序的界面可以分为module-region-control,所以下面一步就是注册module
module可以理解成是一组有关联的服务、界面、功能等等,主要是为了能够实现软件的个性化需求以及开发过程中的可扩展性,大多数软件都有用户角色的管理,对应不同级别的角色提供不同级别的功能,这里就需要用到module了。
- 创建一个module.cs文件继承自IModule
- 重写RegisterTypes(IContainerRegistry containerRegistry)和OnInitialized(IContainerProvider containerProvider)方法,其中一些模块相关的类型或者服务可以放在这里的RegisterTypes方法里注册,OnInitialized主要是为了初始化视图,通过这里可以动态的实现模块对应的UI方面的加载。
- 按需加载module,多种方式,通过app.xaml.cs的configureModuleCatalog() 或者通过IModuleManager.LoadModule()等方法
region
要理解region相关的用法,需要理解regionManager和region的不同用法,我们先来看一下IRegionManager的类成员,主要分为AddToRegion()、Regions、RegisterViewWithRegion()、RequestNavigate()这几个成员,而RegionManager.Regions返回的是List,所以我们顺带看一下IRegion的成员:主要有Add()、Remove()、Activate()、Deactivate()、Views()这几个成员。
我们重点关注下面几个函数:
1.RegionManager.AddToRegion();
这里看一下源码,实际上和IRegion.Add()方法等同的,都是将一个视图加入到region区域中去,至于这个“加入”代表的意思是根据region所绑定的控件类型所决定的:如果是contentControl 则只会显示最后一个add的界面,如果是itemsControl或者是tabControl则会显示所有的界面,比如tabcontrol会把所有add的界面以tabitem的形式摆放
2.RegisterViewWithRegion();
这个方法和AddToRegion有什么区别呢?这个方法是将某个view和region进行绑定,后面无法再动态增删这个region里面的内容了,而AddToRegion则可以动态绑定。
navigate
RequestNavigate()这个方法,顾名思义,导航函数,关于导航,需要知道:导航的两个条件:
1.注册region
2.注册导航页面 registerForNavigation<view,viewModel>(“别名”);
使用regionManager,RequestNavigate(“RegionName”,“ViewName”)导航到对应页面。
如果想更精细的控制导航的逻辑,可以在对应的view中,继承INavigationAware,其中IsNavigationTarget 是 Prism 框架INavigationAware 接口的一部分,用于处理视图导航。当使用 Prism 的导航功能在视图之间进行切换时,IsNavigationTarget 用来决定是否可以重用已存在的视图实例,还是应该创建一个新的视图实例。使用OnNavigatedTo获取journal 然后在对应的按钮 journal.goback();这个就是回退视图。
dialog
DialogService,prism为对话框服务提供了便利,只需要在RegisterType()里注册对应的类型,然后在viewmodel根据注册的dialog名称调用即可,但是需要注意一点:
在使用dialogService的时候,dialog对应的view必须是usercontrol类型,而且viewmodel必须继承idialogAware接口。
由于dialog的view必须是usercontrol,所以没办法控制外层window的样式,但是可以通过自定义window样式,也是在registerType函数里注册RegisterDialogWindow();
eventAggregator
对于不同的viewmodel或者模块之间的通信,使用EventAgregator(事件聚合器),分为publisher和subscriber
- 首先定义事件类,需要继承PubSubEvent:
例如:public class TickerSymbolSelectedEvent : PubSubEvent{} - 发布方需要定义一个事件聚合器对象IEventAggregator _eventAggregator;并进行实例化,一般发布事件的过程是_eventAggregator.GetEvent().Publish(“STOCK0”);(因为定义了string类型)
- 订阅方就是 ea.GetEvent().Subscribe(ShowNews);其中shownews应该是一个函数指针或者lambda
subscribe有重载版本可以指定在哪个线程执行action
其他的还有delegateCommand,compositeCommand,使用方法比较简单,不再赘述。