.NET 6.0 + WPF 使用 Prism 框架實現導航

小码编匠發表於2024-09-11

前言

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.UnityPrism.DryIoc(根據你的需求選擇),然後點選安裝。

Unity是Prism官方推薦的容器之一,但DryIoc在某些情況下可能提供更高的效能。

3、安裝平臺包

  • WPF 安裝 Prism.Wpf

  • Xamarin Forms 安裝 Prism.Forms

  • Uno Platform 安裝 Prism.Uno

  • WinUI 安裝 Prism.WinUI

具體操作步驟,可以參考下圖:

.NET 6.0 + WPF 使用 Prism 框架實現導航

使用 Prism

透過一個手動敲程式碼示例實現 WPF MVVM框架 Prism 導航,具體可以參考以下程式碼。

1、新建WPF專案

首先新建一個WPF專案,根據上面圖示完成Prism的安裝,具體專案結構如下圖所示:

1、框架使用 .NET 6.0、Visual Studio 2022;

2、新建ViewsViewModels資料夾

.NET 6.0 + WPF 使用 Prism 框架實現導航

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.xamlApp.xaml.cs配置了Prism的啟動和依賴注入。

4、啟動程式

透過上面程式碼的編寫,完成WPF框架應用,具體執行效果如下所示:

.NET 6.0 + WPF 使用 Prism 框架實現導航

總結

Prism 是一個專為 WPF 應用程式設計的 MVVM 模式框架,它透過依賴注入和控制反轉容器來促進團隊協作中的松耦合設計。

憑藉其強大的功能和靈活性,Prism 成為了開發企業級應用程式的首選框架。不僅簡化了程式碼結構,提高了應用程式的可維護性和可擴充套件性。

希望這篇文章能幫助你瞭解Prism框架的基本概念、安裝步驟以及如何使用。

最後

如果你覺得這篇文章對你有幫助,不妨點個贊支援一下!你的支援是我繼續分享知識的動力。如果有任何疑問或需要進一步的幫助,歡迎隨時留言。

也可以加入微信公眾號[DotNet技術匠] 社群,與其他熱愛技術的同行一起交流心得,共同成長!優秀是一種習慣,歡迎大家留言學習!

相關文章