前言
學習一下Prism。
1.Prism
Prism框架提供了一套豐富的工具、類和模塊,幫助開發人員實現以下功能:
- 模塊化:Prism框架支持將應用程序拆分為多個模塊,每個模塊具有自己的功能和視圖。這種模塊化的設計使得應用程序更加靈活和可擴展。
- 導航:Prism框架提供了導航功能,可以方便地在不同的視圖之間進行導航和交互。開發人員可以定義導航路徑和參數,以及處理導航事件。
- 依賴注入:Prism框架內置了一個輕量級的依賴注入容器,可以幫助開發人員管理和解決組件之間的依賴關系。這樣可以提高代碼的可測試性和可維護性。
- 事件聚合器:Prism框架提供了一個事件聚合器,可以幫助不同模塊之間進行解耦和通信。開發人員可以通過發布和訂閱事件來實現模塊之間的交互。
- 命令綁定:Prism框架支持命令綁定,可以將用戶操作和后臺邏輯進行綁定。這樣可以更好地分離用戶界面和業務邏輯。
- 可測試性:Prism框架的設計考慮了應用程序的可測試性,提供了一些工具和模式,幫助開發人員編寫可測試的代碼。
1.1創建WPF
創建WPF程序,我是基于net8框架創建。
安裝包
Prism.DryIoc
修改App.xaml
繼承PrismApplication并實現CreateShell(設置啟動頁)、RegisterTypes(注冊服務)
因為即設置了啟動頁,也設置了StartupUri,所以彈出了倆個窗體。
1.2創建Prism
打開vs,我的是vs2022,管理擴展
查找Prism,安裝 Prism Template Pack
安裝完后,關閉所有vs,再打開就會自動修改vs2022的配置,等待修改完畢即可
創建WPF Prism Full項目
選擇DryIoc
創建成功
2.Prism區域
2.1實現區域切換
創建ViewModels、Views文件夾內,注意名稱,容器就是根據命名空間找到對應的類。
新建三個用戶控件,并在App注入服務。
需要修改MainWindow的命名空間,加上Views,要不容器無法找到,算是一個小坑。
MainWindow加上幾個按鈕和ContentControl用于區域切換。
button加上參數,用于后臺命令根據名稱切換界面。
prism:ViewModelLocator.AutoWireViewModel="True"。
MainWindowViewModel實現BindableBase。
實現顯示內容命令(DelegateCommand),根據前臺傳入的參數顯示區域。
2.2解耦優化
注入IRegionManager(區域管理),通過IRegionManager去實例化用戶控件。
App重載一下RegisterForNavigation。
如果不想使用別名需要全名,這里使用別名。
3.Prism模塊化
3.1引用模塊
創建WPF程序模塊A和模塊B
刪除WPF程序自帶的一些文件。
然后把Peng.MoudleA和Peng.MoudleB輸出類型改為類庫。
為什么創建WPF程序而不是類庫?
因為類庫不能添加WPF窗口、用戶控件等文件,項目需要加載模塊的窗口、用戶控件等。
ModuleA、ModuleB都引用Prism.DryIoc。
<ItemGroup><PackageReference Include="Prism.DryIoc" Version="8.1.97" /></ItemGroup>
實現IModule,把MoudleA和MoudleB注入到IOC容器中。
主程序引入MoudleA和MoudleB,并且改變命令參數為MoudleAUC、MoudleBUC,此名稱對應模塊中用戶控件名稱。
在主程序添加MoudleA和MoudleB。
3.2動態加載
添加Modules文件夾,并且把生成后的MoudleA和MoudleB移到Modules文件夾下。
選擇Peng.MoudleA.dll和Peng.MoudleBdll修改屬性始終復制。
主程序不用引入Peng.MoudleA和Peng.MoudleB了,會動態加載Modules目錄下的dll。
4.導航
4.1傳參
ViewModelLocator.AutoWireViewModel="True"可以通過命名的形式讓控件找到對應的視圖,但是一旦名字寫錯就容易找不到,所以一般不建議這么使用,可以注入的時候指定控件和視圖。
通過添加NavigationParameters字典傳參。
ModuleAUCViewModel需要實現INavigationAware。
通過判斷是否存在Key獲取參數值,然后雙向綁定顯示界面。
重新生成后,記得替換Modules目錄下的dll。
4.2導航后退
增加后退按鈕,綁定后退命令。
實現后退命令。
第一次加載的時候Journal為null,所以需要判斷非null。
傳參數的時候需要添加導航記錄。
實現IConfirmNavigationRequest,這里不需要INavigationAware,因為IConfirmNavigationRequest繼承了INavigationAware
5.Prism對話框
新建Peng.MoudleC用于對話框服務。
簡單寫一下界面,一個Title,一個顯示獲取的參數,還有倆個按鈕。
ModuleCUCViewModel實現BindableBase、IDialogAware。
BindableBase用于和界面綁定。
IDialogAware是對話框服務。
實現IDialogAware幾個方法。
RequestClose是返回對話框狀態,在確定和取消命令的時候返回結果。
在OnDialogOpened時獲取傳入的參數。
在Confirm時返回參數。
最后顯示注入對話框服務。
主界面添加一個按鈕和一個文本框用于打開對話框和顯示對話框傳入的參數。
添加ShowDialogCmd顯示對話框命令。
添加DialogService對話框服務。
在DialogService.ShowDialog回調函數中獲取對話框返回結果。
重新生成后記得改Peng.MoudleC.dll屬性為始終復制。
6.發布訂閱
實現PubSubEvent,T
是訂閱方法的參數類型。
代碼比較簡單,簡單贅述一下。
主界面添加三個按鈕:發布、訂閱、取消訂閱,綁定三個命令。
IEventAggregator是發布訂閱的服務,默認已經注入,可以通過構造函數方式獲取即可。
Publish:發布事件。
Subscribe:訂閱事件。
CancelSub:取消訂閱。