Prism 源碼解讀2-View的載入和控制

  • 2020 年 3 月 30 日
  • 筆記

介紹

上一篇介紹了Region,這一篇跟Region息息相關,講一下Region中View的載入方式及控制。

4、ViewDiscovery

在創建好Region後需要將View添加到Region中。先補充幾個概念

在上一篇將了如何創建Region,現在讓我們看看Region類是什麼

1585492014664

  • private ViewsCollection views;
  • private ViewsCollection activeViews;

1585492216249

這是一個View集合,集合改變會觸發CollectionChanged事件

1585495811302

其完全依賴ObservableCollection對象

1585495861232

  • this.Behaviors = (IRegionBehaviorCollection) new RegionBehaviorCollection((IRegion) this);

1585492307886

這是一個行為集合,每當添加進行為的時候,會主動調用Attach()

1585492378755

  • PropertyChanged事件,每當Context,Name, RegionManager,會觸發該事件

下面來看一個好玩的行為AutoPopulateRegionBehavior

1585493348169

可以看到這個行為對RegionViewRegistry有依賴,這個是通過構造注入的方式注入的。

1585493881067

該RegionViewRegistry保存著所有的View,是名副其實的Registry.

1585494113642

該Registry有一個事件ContentRegistered,

1585494177640

每當調用這個方法的時候就會觸發這個事件。

不能跑偏了,回到AutoPopulateRegionBehavior

1585494258548

在行為Attach的時候,已經對RegionViewRegistry進行了訂閱。

1585494345106

1585494374088

看看this.Region.Add()

1585494424733

1585494443683

1585494495775

這個ItemMetadataCollection的改變會影響Views和ActiveViews

1585495029949

首先它是一個ObservableCollection,

1585495066707

1585495082020

其次ViewCollection就是依賴ItemMetadataCollection創建的,所以改變自然會影響ViewCollection

那這個VIewCollection是怎麼來影響介面的呢,這就要看看另一個行為RegionActiveAwareBehavior

1585495262471

1585495273837

1585495286661

1585495314530

1585495354241

至此可能會一頭霧水,這講了什麼啊,一會是Region,一會是Behavior,到底想說什麼啊?其實就是講了View是如何被自動注入到對應的Region。

下面讓我們跟著Samples中的ViewDiscovery並結合剛剛講的源碼梳理一下。

  • 在程式開始的時候向行為工廠中注入了相應的行為

1585496457588

  • 在創建Region的時候RegionAdapter向其添加了所有的行為

1585496767032

  • 現在只需調用RegionManager.RegisterViewWithRegion方法就可以自動向Region中添加VIew並顯現出來

1585497087938

1585496954834

可以看到就是調用RegionViewRegistry中Register’VIew’With’Region方法

  • 下面就等著AutoPopulateRegionBehavior和RegionActiveAwareBehavior按照上面的方式工作就可以了。

可以看出為什麼Region有這麼強大的功能就是因為Prism給Region提供了很多的行為,行為作為WPF的一個特性,其作用是非常強大的。後面的View生命周期管理也是通過行為來完成的

5、ViewInjection

View手動載入到Region,通過一個點擊事件,通過RegionManager的Regions屬性添加View

1585497500713

這個就更簡單了,因為沒有走RegionVIewRegistry,而是直接通過Region添加View,會直接添加到對應的RegionView上,然後通過RegionActiveAwareBehavior顯示,上面有就不再詳盡敘述了。

6、ViewActivationDeactivation

激活或停用View

這個也不多BB直接看怎麼調用

1585498127903

首先先用手動的方式向Region中添加兩個View

1585498162692

就是兩個方法Activate和Deactivate

1585498267866

這實現也太巧妙了吧,通過ItemMetadata直接影響了View和ActiveView,然後通過RegionActiveAwareBehavior行為實現。真帥

1585498410120

就不再敘述了。

總結

本章主要講了View的載入方式,可以手動載入,可以自動載入,並可以控制View的Activate和DeActivate。其主要實現都是依靠行為,也從側面反映出行為的強大,行為能做的事情實在太多了。下一章會對Modules的實現進行介紹。