Prism 是一个用于在 .NET 中构建松耦合、可维护且可测试的 XAML 应用程序的开源框架,它基于设计模式(如 MVVM、依赖注入、命令、事件聚合器等)。以下是其核心概念、优势及一个基础入门示例。

Prism 核心特性与优势

特性 说明 解决的问题/优势
模块化 应用程序被分解为多个独立的模块,可以单独开发、测试和部署。 提升大型项目的可维护性、可扩展性和团队协作效率。
依赖注入 (DI) 内置对 Unity 等容器的支持,用于管理服务与视图模型的依赖关系。 实现松耦合,便于单元测试和替换实现。
导航 提供区域 (Region) 管理和导航服务,实现视图的动态加载与切换。 解耦视图切换逻辑与具体视图,使 UI 组合更灵活。
事件聚合器 一种发布/订阅机制,允许模块间进行松散的通信。 模块间无需直接引用,降低耦合度。
MVVM 模式支持 提供 BindableBaseDelegateCommand 等类,简化 ViewModel 开发。 清晰分离 UI 逻辑与业务逻辑,提升可测试性。

基础入门:创建一个简单的 Prism WPF 应用

以下步骤展示如何使用 Prism 和 Unity 容器创建一个最基本的 WPF 应用。

1. 创建项目并安装 NuGet 包
创建一个新的 WPF 应用项目,然后通过 NuGet 包管理器安装以下包:

  • Prism.Unity (此包通常会自动引入 Prism.CorePrism.Wpf)

2. 修改 App.xaml
删除 StartupUri,并修改 Application 的基类为 PrismApplication

<!-- App.xaml -->
<prism:PrismApplication x:Class="PrismDemo.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:prism="http://prismlibrary.com/">
    <Application.Resources>
    </Application.Resources>
</prism:PrismApplication>

3. 修改 App.xaml.cs
重写 CreateShellRegisterTypes 方法。

// App.xaml.cs
using Prism.Ioc;
using Prism.Unity;
using System.Windows;

namespace PrismDemo
{
    public partial class App : PrismApplication
    {
        // 创建应用程序的主窗口 protected override Window CreateShell()
        {
            // 从容器中解析主窗口(Shell)
            return Container.Resolve<MainWindow>();
        }

        // 在此注册类型到依赖注入容器 protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            // 示例:注册一个服务
            // containerRegistry.Register<IMyService, MyService>();
        }
    }
}

4. 设置主窗口 (Shell) 和区域
MainWindow.xaml 中,使用 Prism 的区域 (RegionManager) 来定义可动态加载内容的区域。

<!-- MainWindow.xaml -->
<Window x:Class="PrismDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        Title="Prism Demo" Height="350" Width="525">
    <Grid>
        <!-- 定义一个名为“ContentRegion”的区域 -->
        <ContentControl prism:RegionManager.RegionName="ContentRegion" />
    </Grid>
</Window>

5. 创建模块、视图和 ViewModel

  • ViewModel:继承 BindableBase,实现属性通知。
// ViewModels/MainViewModel.cs
using Prism.Commands;
using Prism.Mvvm;

namespace PrismDemo.ViewModels
{
    public class MainViewModel : BindableBase
    {
        private string _message = "Hello Prism!";
        public string Message
        {
            get { return _message; }
            set { SetProperty(ref _message, value); }
        }

        private DelegateCommand _clickCommand;
        public DelegateCommand ClickCommand =>
            _clickCommand ?? (_clickCommand = new DelegateCommand(ExecuteClick));

        private void ExecuteClick()
        {
            Message = "Button Clicked!";
        }
    }
}
  • View:一个 UserControl,其 DataContext 将通过 Prism 自动绑定到对应的 ViewModel。
<!-- Views/MainView.xaml -->
<UserControl x:Class="PrismDemo.Views.MainView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="{Binding Message}" FontSize="24" Margin="10"/>
        <Button Content="Click Me" Command="{Binding ClickCommand}" Width="100" Height="30"/>
    </StackPanel>
</UserControl>
// Views/MainView.xaml.cs
using System.Windows.Controls;

namespace PrismDemo.Views
{
    public partial class MainView : UserControl
    {
        public MainView()
        {
            InitializeComponent();
        }
    }
}

6. 在应用启动时导航到视图
App.xaml.csOnInitialized 方法中,使用 IContainerProvider 解析 IRegionManager,并将视图导航到主窗口的区域中。

// App.xaml.cs (补充)
using Prism.Regions;

namespace PrismDemo
{
    public partial class App : PrismApplication {
        // ... 之前的 CreateShell 和 RegisterTypes 方法 ...

        protected override void OnInitialized()
        {
            base.OnInitialized();
            
            // 获取主窗口实例 var shellWindow = Container.Resolve<MainWindow>();
 // 获取区域管理器
            var regionManager = Container.Resolve<IRegionManager>();
 // 将 MainView 注册到 ContentRegion            // 这里使用了 View Discovery(视图发现)的方式
            regionManager.RegisterViewWithRegion("ContentRegion", typeof(Views.MainView));
            
            // 显示主窗口 shellWindow.Show();
        }
    }
}

运行此应用程序,你将看到一个显示“Hello Prism!”和按钮的窗口,点击按钮文本会更新。这个简单的例子涵盖了 Prism 应用的启动流程、区域管理和基本的 MVVM 数据绑定。对于更复杂的模块化开发、导航和事件聚合等高级特性,可以参考 Prism 的官方文档和更详细的教程。


参考来源

 

更多推荐