在實際應用開發中,隨著項目業務逐漸複雜,耦合度會越來越高,維護成本也會直線上升,所以解耦也變得越來越重要。Prism框架為WPF開發中解耦提供了非常便捷的應用。今天主要以一個簡單的小例子,簡述WPF開發中Prism框架的簡單應用,如有不足之處,還請指正。 ...
在實際應用開發中,隨著項目業務逐漸複雜,耦合度會越來越高,維護成本也會直線上升,所以解耦也變得越來越重要。Prism框架為WPF開發中解耦提供了非常便捷的應用。今天主要以一個簡單的小例子,簡述WPF開發中Prism框架的簡單應用,如有不足之處,還請指正。
什麼是Prism?
Prism是一個開源框架,用於在WPF、Xamarin Forms、Uno/Win UI等應用中創建松耦合、可維護、可測試的XAML應用程式。Prism提供了一組設計模式的實現,這些設計模式有助於編寫結構良好且可維護的XAML應用程式,包括MVVM,dependency injection,commands,EventAggregator等。
Prism源碼庫
Prism遵守開源許可協議(MIT),目前最新版本8.1.97,可通過GitHub進行下載最新版本。https://github.com/PrismLibrary
Prism優點
Prism 設計圍繞核心建築設計原則,即關註點分離和鬆散耦合。這使得Prism可以提供許多好處
-
重覆使用:通過重覆使用單元測試的組件,可以通過依賴性註入在運行時間輕鬆發現和集成,以及通過使用可在應用程式中重覆使用的應用程式級功能封裝模塊,在應用級別實現重覆使用。
-
可擴展性:通過管理組件依賴性、使組件在運行時間更容易集成或替換為替代實現以及提供將應用程式分解為可獨立更新和部署的模塊的能力,幫助創建易於擴展的應用程式
-
靈活性:Prism 有助於創建靈活的應用程式,使它們能夠隨著新功能的開發和集成而更容易更新
-
團隊發展:Prism 有助於最大限度地減少跨團隊依賴性,並允許團隊專註於不同的功能領域(如 UI 設計、業務邏輯實現和基礎架構代碼開發),或不同業務級別的功能領域(如簡介、銷售、庫存或物流)。
模塊化思想
通過對比發現,採用模塊化思想進行設計,使得程式結構清晰,符合高內聚,低耦合的設計風格。
Prism安裝
Prism可通過NuGet方案包管理器進行安裝,主要安裝三個Prism.Core,Prism.Unity,Prism.Wpf
創建模塊和視圖控制項
創建WPF類庫,並添加用戶控制項視圖,並採用MVVM開發模式
數據綁定
在Prism框架中,提供了數據綁定基類Prism.Mvvm.BindableBase,可以方便的將普通屬性,轉換為依賴屬性,簡化開發中過程中的代碼量。
1 namespace DemoPrism.Second.ViewModels 2 { 3 internal class SecondViewModel : BindableBase 4 { 5 #region 屬性及構造函數 6 7 private int id; 8 9 public int Id 10 { 11 get { return id; } 12 set { SetProperty(ref id, value); } 13 } 14 15 /// <summary> 16 /// 模塊間交互 17 /// </summary> 18 private readonly IEventAggregator eventAggregator; 19 20 public SecondViewModel(IEventAggregator eventAggregator) 21 { 22 this.eventAggregator = eventAggregator; 23 this.eventAggregator.GetEvent<DemoOneEvent>().Subscribe(DemoOneRecived); 24 } 25 #endregion 26 private void DemoOneRecived(int id) 27 { 28 this.Id = id; 29 } 30 } 31 }
創建Prism模塊
添加Module類,並實現Prism.Modularity.IModule介面,實現介面的模塊,視為可以被Prism發現並載入的模塊。以DefectListModule模塊為例:
1 namespace DemoPrism.First 2 { 3 public class FirstModule : IModule 4 { 5 public void OnInitialized(IContainerProvider containerProvider) 6 { 7 IRegionManager regionManager = containerProvider.Resolve<IRegionManager>(); 8 regionManager.RegisterViewWithRegion("FirstRegion", typeof(Views.FirstView)); 9 } 10 11 public void RegisterTypes(IContainerRegistry containerRegistry) 12 { 13 containerRegistry.RegisterForNavigation<Views.FirstView, ViewModels.FirstViewModel>(); 14 } 15 } 16 }
模塊配置
Prism提供了多種模塊載入方式,常用的有App.config配置文件方法。
-
在App.config節點,添加configSections配置,增加modules節點配置
-
modules節點主要配置需要載入的Prism模塊
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <!--prism配置--> 5 <section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf"/> 6 </configSections> 7 <modules> 8 <!--註冊模塊--> 9 <module assemblyFile="Modules\DemoPrism.First.dll" moduleType="DemoPrism.First.FirstModule, DemoPrism.First" moduleName="First" startupLoaded="true" /> 10 <module assemblyFile="Modules\DemoPrism.Second.dll" moduleType="DemoPrism.Second.SecondModule, DemoPrism.Second" moduleName="Second" startupLoaded="true" /> 11 </modules> 12 </configuration>
模塊載入
模塊配置好後,需要在啟動的時候,載入模塊。修改WPF入口啟動程式,App.xaml.cs文件,繼承自Prism.Unity.PrismApplication基類,並重寫相關初始化
1 namespace DemoPrism 2 { 3 /// <summary> 4 /// Interaction logic for App.xaml 5 /// </summary> 6 public partial class App : PrismApplication 7 { 8 //使用容器創建主窗體 9 protected override Window CreateShell() => Container.Resolve<MainWindow>(); 10 11 12 protected override void ConfigureViewModelLocator() 13 { 14 base.ConfigureViewModelLocator(); 15 } 16 17 protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog) 18 { 19 //通過代碼的方式添加模塊 20 //moduleCatalog.AddModule<NavigationModule.NavigationModule>(); 21 //將MedicineModule模塊設置為按需載入 22 base.ConfigureModuleCatalog(moduleCatalog); 23 } 24 25 protected override void RegisterTypes(IContainerRegistry containerRegistry) 26 { 27 28 } 29 30 31 protected override IModuleCatalog CreateModuleCatalog() 32 { 33 ConfigurationModuleCatalog configurationModuleCatalog = new ConfigurationModuleCatalog(); 34 configurationModuleCatalog.Load(); 35 36 //通過Xaml配置文件讀取模塊載入信息 37 38 return configurationModuleCatalog; 39 //return directoryModuleCatalog; 40 } 41 42 /// <summary> 43 /// 註冊適配器(區域容器:Region) 44 /// </summary> 45 /// <param name="regionAdapterMappings"></param> 46 protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings) 47 { 48 base.ConfigureRegionAdapterMappings(regionAdapterMappings); 49 } 50 } 51 }
區域Region
在Prism框架中,模塊可以註冊到導航菜單Navigation,也可以註冊到區域Region,根據實際業務需要進行選擇。Region可以更加方便的進行模塊化佈局等。在普通容器控制項中,增加prism:RegionManager.RegionName=”名稱”
1 <Window x:Class="DemoPrism.MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:prism="http://prismlibrary.com/" 7 xmlns:local="clr-namespace:DemoPrism" 8 mc:Ignorable="d" 9 Title="MainWindow" Height="450" Width="800" 10 prism:ViewModelLocator.AutoWireViewModel="True"> 11 <Grid> 12 <Grid.ColumnDefinitions> 13 <ColumnDefinition></ColumnDefinition> 14 <ColumnDefinition></ColumnDefinition> 15 </Grid.ColumnDefinitions> 16 <ContentControl Grid.Column="0" prism:RegionManager.RegionName="FirstRegion"></ContentControl> 17 <ContentControl Grid.Column="1" prism:RegionManager.RegionName="SecondRegion"></ContentControl> 18 </Grid> 19 </Window>
模塊交互
模塊與模塊之間相互獨立,如果需要交互,可以通過事件聚合器IEventAggregator,採用事件的訂閱和發佈進行通信。
事件訂閱步驟:
-
定義事件,定義一個類,繼承自Prism.Events.PubSubEvent泛型類
-
事件發佈,通過事件聚合器的Publish方法進行發佈。
-
事件訂閱,通過事件聚合器的Subscribe進行訂閱。
1 namespace DemoPrism.Event 2 { 3 /// <summary> 4 /// 註冊事件 5 /// </summary> 6 public class DemoOneEvent : PubSubEvent<int> 7 { 8 9 } 10 }
彈出模態視窗
在Prism框架下,彈出模態視窗,需要以下3個步驟:
-
在Prism框架中,頁面UserControl實現彈窗功能,被彈出頁面需要實現Prism.Services.Dialogs.IDialogAware介面。
-
註冊視窗,將UserControl註冊成視窗。
-
調用彈出服務,彈出視窗
源碼下載
示例中源碼下載,在公眾號恢復關鍵詞PRISM,如下所示:
學習編程,從關註【老碼識途】開始!!!
作者:小六公子
出處:http://www.cnblogs.com/hsiang/
本文版權歸作者和博客園共有,寫文不易,支持原創,歡迎轉載【點贊】,轉載請保留此段聲明,且在文章頁面明顯位置給出原文連接,謝謝。
關註個人公眾號,定時同步更新技術及職場文章