Prism 源码解读2-View的加载和控制

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Prism 源码解读2-View的加载和控制

杜金锋   2020-03-30 我要评论
## 介绍 上一篇介绍了Region,这一篇跟Region息息相关,讲一下Region中View的加载方式及控制。 ## 4、ViewDiscovery 在创建好Region后需要将View添加到Region中。先补充几个概念 在上一篇将了如何创建Region,现在让我们看看Region类是什么 ![1585492014664](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720230-2111148795.png) - private ViewsCollection views; - private ViewsCollection activeViews; ![1585492216249](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720230-244075720.png) 这是一个View集合,集合改变会触发CollectionChanged事件 ![1585495811302](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720261-1251618589.png) 其完全依赖ObservableCollection对象 ![1585495861232](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720268-1083396575.png) - this.Behaviors = (IRegionBehaviorCollection) new RegionBehaviorCollection((IRegion) this); ![1585492307886](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720269-923661723.png) 这是一个行为集合,每当添加进行为的时候,会主动调用Attach() ![1585492378755](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720265-227578803.png) - PropertyChanged事件,每当Context,Name, RegionManager,会触发该事件 下面来看一个好玩的行为AutoPopulateRegionBehavior ![1585493348169](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720266-1117628955.png) 可以看到这个行为对RegionViewRegistry有依赖,这个是通过构造注入的方式注入的。 ![1585493881067](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720271-689079839.png) 该RegionViewRegistry保存着所有的View,是名副其实的Registry. ![1585494113642](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720266-667412800.png) 该Registry有一个事件ContentRegistered, ![1585494177640](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720271-1102706865.png) 每当调用这个方法的时候就会触发这个事件。 不能跑偏了,回到AutoPopulateRegionBehavior ![1585494258548](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720276-1971196865.png) 在行为Attach的时候,已经对RegionViewRegistry进行了订阅。 ![1585494345106](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720266-120257775.png) ![1585494374088](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720274-1915381196.png) 看看this.Region.Add() ![1585494424733](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720271-1867842882.png) ![1585494443683](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720266-136662533.png) ![1585494495775](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720276-2088713349.png) 这个ItemMetadataCollection的改变会影响Views和ActiveViews ![1585495029949](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720260-1730120114.png) 首先它是一个ObservableCollection, ![1585495066707](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720270-868519627.png) ![1585495082020](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720231-1739582629.png) 其次ViewCollection就是依赖ItemMetadataCollection创建的,所以改变自然会影响ViewCollection 那这个VIewCollection是怎么来影响界面的呢,这就要看看另一个行为RegionActiveAwareBehavior ![1585495262471](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720261-710531822.png) ![1585495273837](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720231-1609141047.png) ![1585495286661](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720269-357975652.png) ![1585495314530](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720275-1587125635.png) ![1585495354241](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720269-22166765.png) 至此可能会一头雾水,这讲了什么啊,一会是Region,一会是Behavior,到底想说什么啊?其实就是讲了View是如何被自动注入到对应的Region。 下面让我们跟着Samples中的ViewDiscovery并结合刚刚讲的源码梳理一下。 - 在程序开始的时候向行为工厂中注入了相应的行为 ![1585496457588](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720277-1819200085.png) - 在创建Region的时候RegionAdapter向其添加了所有的行为 ![1585496767032](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720275-746304152.png) - 现在只需调用RegionManager.RegisterViewWithRegion方法就可以自动向Region中添加VIew并显现出来 ![1585497087938](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720279-477935658.png) ![1585496954834](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720275-1906655016.png) 可以看到就是调用RegionViewRegistry中Register'VIew'With'Region方法 - 下面就等着AutoPopulateRegionBehavior和RegionActiveAwareBehavior按照上面的方式工作就可以了。 可以看出为什么Region有这么强大的功能就是因为Prism给Region提供了很多的行为,行为作为WPF的一个特性,其作用是非常强大的。后面的View生命周期管理也是通过行为来完成的 ## 5、ViewInjection View手动加载到Region,通过一个点击事件,通过RegionManager的Regions属性添加View ![1585497500713](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720279-810027595.png) 这个就更简单了,因为没有走RegionVIewRegistry,而是直接通过Region添加View,会直接添加到对应的RegionView上,然后通过RegionActiveAwareBehavior显示,上面有就不再详尽叙述了。 ## 6、ViewActivationDeactivation 激活或停用View 这个也不多BB直接看怎么调用 ![1585498127903](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720295-1342688764.png) 首先先用手动的方式向Region中添加两个View ![1585498162692](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720292-1779360121.png) 就是两个方法Activate和Deactivate ![1585498267866](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720295-1548553023.png) 这实现也太巧妙了吧,通过ItemMetadata直接影响了View和ActiveView,然后通过RegionActiveAwareBehavior行为实现。真帅 ![1585498410120](https://img2020.cnblogs.com/blog/1078802/202003/1078802-20200330001720292-645242427.png) 就不再叙述了。 ## 总结 本章主要讲了View的加载方式,可以手动加载,可以自动加载,并可以控制View的Activate和DeActivate。其主要实现都是依靠行为,也从侧面反映出行为的强大,行为能做的事情实在太多了。下一章会对Modules的实现进行介绍。

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们