Prism 一個開源的框架,專門用於開發可擴充套件、模組化和可測試的企業級 XAML 應用程式,適用於 WPF(Windows Presentation Foundation)和 Xamarin Forms 等平臺。
Prism 基於 MVVM(Model-View-ViewModel)設計模式,提供一套豐富的工具和庫,能夠實現模組化、依賴注入、導航和事件聚合等功能。
本文將介紹 Prism 框架的基本概念、安裝步驟以及使用。
什麼是Prism?
Prism 是一個用於開發靈活、可維護的 WPF、Windows 10 UWP 和 Xamarin.Forms 應用程式的框架。它是由微軟的模式與實踐團隊開發的,,構建模組化、可測試的應用程式。Prism 包含了幾個核心元件,以支援應用程式的架構和設計模式:
1、依賴注入(Dependency Injection)
Prism 提供了一個依賴注入容器,可以將應用程式的元件和服務進行解耦,從而提高程式碼的可測試性和可維護性。
2、模組化(Modularity)
Prism 支援模組化設計,將應用程式分解成獨立的模組,每個模組負責特定的功能。這樣助於減少應用程式的複雜性,並能夠使開發和維護更加容易。
3、導航(Navigation)
Prism 提供了一個靈活的導航系統,可以定義檢視之間的導航路徑,並管理檢視的生命週期。
4、事件聚合器(Event Aggregator)
這是一個鬆散耦合的事件釋出/訂閱機制,應用程式的不同部分之間進行通訊,而不需要直接引用對方。
5、命令(Commands)
Prism 提供了一種簡化的方式來處理使用者介面中的命令,如按鈕點選事件。
6、資料繫結(Data Binding)
雖然 Prism 本身不提供資料繫結機制,但它與 WPF 和 Xamarin.Forms 的資料繫結框架緊密整合,可以輕鬆地將檢視模型與檢視進行繫結。
7、檢視模型(ViewModel)
Prism 鼓勵使用檢視模型模式,是一種將業務邏輯與使用者介面分離的設計模式,有助於程式更加清晰和可維護。
安裝 Prism
Prism 可透過NuGet方案包管理器進行安裝,主要安裝三個Prism.Core、Prism.Unity、Prism.Wpf。
首先建立一個新的 WPF、Xamarin Forms、Uno 或 WinUI 專案,然後開啟 NuGet 包管理器,右鍵點選專案 -> 選擇"管理 NuGet 包"。
1、安裝 Prism 核心包
在NuGet包管理器中,搜尋並安裝 Prism.Core
。
2、安裝容器包
在NuGet包管理器中,搜尋Prism.Unity
或Prism.DryIoc
(根據你的需求選擇),然後點選安裝。
Unity是Prism官方推薦的容器之一,但DryIoc在某些情況下可能提供更高的效能。
3、安裝平臺包
-
WPF 安裝
Prism.Wpf
-
Xamarin Forms 安裝
Prism.Forms
-
Uno Platform 安裝
Prism.Uno
-
WinUI 安裝
Prism.WinUI
具體操作步驟,可以參考下圖:
使用 Prism
透過一個手動敲程式碼示例實現 WPF MVVM框架 Prism 導航,具體可以參考以下程式碼。
1、新建WPF專案
首先新建一個WPF
專案,根據上面圖示完成Prism的安裝,具體專案結構如下圖所示:
1、框架使用 .NET 6.0、Visual Studio 2022;
2、新建Views
與ViewModels
資料夾
2、重寫 App.xaml
新增名稱空間xmlns:prism="http://prismlibrary.com/"
記得刪除StartupUri="MainWindow.xaml
繼承由Application->PrismApplication,程式碼如下所示:
<prism:PrismApplication x:Class="ManageCore.WpfApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:ManageCore.WpfApp" xmlns:prism="http://prismlibrary.com/"> <Application.Resources> </Application.Resources> </prism:PrismApplication>
3、修改 App.xaml.cs
繼承由Application->PrismApplication, 程式碼如下所示:
public partial class App : PrismApplication { protected override Window CreateShell() { return Container.Resolve<MainWindow>(); } protected override void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation<Home, HomeViewModel>(); containerRegistry.RegisterForNavigation<Edge, EdgeViewModel>(); } protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); } }
在這裡實現了兩個抽象方法:
CreateShell
該方法返回了一個Window型別的視窗, 其實就是返回應用程式的主視窗。
RegisterTypes
該方法用於在Prism初始化過程中, 我們定義自身需要的一些註冊型別, 以便於在Prism中可以使用。
注意:
Views
資料夾下新建了兩個 UserControlHome、Edge
並在RegisterTypes
進行註冊。
ViewModels
資料夾下新建了兩個VM HomeViewModel、EdgeViewModel
進行註冊。
4、修改 MainWindow.xaml
-
新增名稱空間
xmlns:prism="http://prismlibrary.com/"
-
設定
prism:ViewModelLocator.AutoWireViewModel="True" Prism
框架會根據規則自動查詢該檢視相對應ViewModel。 -
使用了
WPFDevelopers
中的DrawerMenu
進行切換選單。
<wd:Window x:Class="ManageCore.WpfApp.Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:wd="https://github.com/WPFDevelopersOrg/WPFDevelopers" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:ManageCore.WpfApp" xmlns:vm="clr-namespace:ManageCore.WpfApp.ViewModels" xmlns:prism="http://prismlibrary.com/" xmlns:i="http://schemas.microsoft.com/xaml/behaviors" Title="Prism - 導航欄" Width="800" Height="450" prism:ViewModelLocator.AutoWireViewModel="True"> <Grid> </Grid> </wd:Window>
5、MainWindowViewModel
選中ViewModels
檔案右鍵建立MainWindowViewModel
繼承BindableBase
-
使用
RegionManager
上呼叫RequestNavigate
方法,該方法允許您指定要導航的區域。 -
使用
RegionManager
上的RegisterViewWithRegion
載入View
。 -
使用
RegionManager
上的RequestNavigate
導航選單。
MainWindow.xaml
透過prism:ViewModelLocator.AutoWireViewModel="True"
屬性自動繫結了MainWindowViewModel
。
這樣,當MainWindow
被載入時,Prism會自動建立並關聯MainWindowViewModel
例項。
public class MainWindowViewModel : BindableBase { private DrawerMenuItem _selectedItem; public DrawerMenuItem SelectedItem { get { return _selectedItem; } set { SetProperty(ref _selectedItem, value); } } public DelegateCommand SelectionChangedCommand { get; } private readonly IRegionManager _regionManager; /// <summary> /// /// </summary> /// <param name="regionManager"></param> public MainWindowViewModel(IRegionManager regionManager) { } void UpdateRegionViews() { } }
示例中建立了一個簡單的Prism應用程式,其中App.xaml
和App.xaml.cs
配置了Prism的啟動和依賴注入。
4、啟動程式
透過上面程式碼的編寫,完成WPF框架應用,具體執行效果如下所示:
總結
Prism 是一個專為 WPF 應用程式設計的 MVVM 模式框架,它透過依賴注入和控制反轉容器來促進團隊協作中的松耦合設計。
如果你覺得這篇文章對你有幫助,不妨點個贊支援一下!你的支援是我繼續分享知識的動力。如果有任何疑問或需要進一步的幫助,歡迎隨時留言。
也可以加入微信公眾號[DotNet技術匠] 社群,與其他熱愛技術的同行一起交流心得,共同成長!優秀是一種習慣,歡迎大家留言學習!