Prism 源碼解讀2-View的載入和控制
- 2020 年 3 月 30 日
- 筆記
介紹
上一篇介紹了Region,這一篇跟Region息息相關,講一下Region中View的載入方式及控制。
4、ViewDiscovery
在創建好Region後需要將View添加到Region中。先補充幾個概念
在上一篇將了如何創建Region,現在讓我們看看Region類是什麼
- private ViewsCollection views;
- private ViewsCollection activeViews;
這是一個View集合,集合改變會觸發CollectionChanged事件
其完全依賴ObservableCollection對象
- this.Behaviors = (IRegionBehaviorCollection) new RegionBehaviorCollection((IRegion) this);
這是一個行為集合,每當添加進行為的時候,會主動調用Attach()
- PropertyChanged事件,每當Context,Name, RegionManager,會觸發該事件
下面來看一個好玩的行為AutoPopulateRegionBehavior
可以看到這個行為對RegionViewRegistry有依賴,這個是通過構造注入的方式注入的。
該RegionViewRegistry保存著所有的View,是名副其實的Registry.
該Registry有一個事件ContentRegistered,
每當調用這個方法的時候就會觸發這個事件。
不能跑偏了,回到AutoPopulateRegionBehavior
在行為Attach的時候,已經對RegionViewRegistry進行了訂閱。
看看this.Region.Add()
這個ItemMetadataCollection的改變會影響Views和ActiveViews
首先它是一個ObservableCollection,
其次ViewCollection就是依賴ItemMetadataCollection創建的,所以改變自然會影響ViewCollection
那這個VIewCollection是怎麼來影響介面的呢,這就要看看另一個行為RegionActiveAwareBehavior
至此可能會一頭霧水,這講了什麼啊,一會是Region,一會是Behavior,到底想說什麼啊?其實就是講了View是如何被自動注入到對應的Region。
下面讓我們跟著Samples中的ViewDiscovery並結合剛剛講的源碼梳理一下。
- 在程式開始的時候向行為工廠中注入了相應的行為
- 在創建Region的時候RegionAdapter向其添加了所有的行為
- 現在只需調用RegionManager.RegisterViewWithRegion方法就可以自動向Region中添加VIew並顯現出來
可以看到就是調用RegionViewRegistry中Register’VIew’With’Region方法
- 下面就等著AutoPopulateRegionBehavior和RegionActiveAwareBehavior按照上面的方式工作就可以了。
可以看出為什麼Region有這麼強大的功能就是因為Prism給Region提供了很多的行為,行為作為WPF的一個特性,其作用是非常強大的。後面的View生命周期管理也是通過行為來完成的
5、ViewInjection
View手動載入到Region,通過一個點擊事件,通過RegionManager的Regions屬性添加View
這個就更簡單了,因為沒有走RegionVIewRegistry,而是直接通過Region添加View,會直接添加到對應的RegionView上,然後通過RegionActiveAwareBehavior顯示,上面有就不再詳盡敘述了。
6、ViewActivationDeactivation
激活或停用View
這個也不多BB直接看怎麼調用
首先先用手動的方式向Region中添加兩個View
就是兩個方法Activate和Deactivate
這實現也太巧妙了吧,通過ItemMetadata直接影響了View和ActiveView,然後通過RegionActiveAwareBehavior行為實現。真帥
就不再敘述了。
總結
本章主要講了View的載入方式,可以手動載入,可以自動載入,並可以控制View的Activate和DeActivate。其主要實現都是依靠行為,也從側面反映出行為的強大,行為能做的事情實在太多了。下一章會對Modules的實現進行介紹。