Prism Template Pack 完整使用示例(VS2022 + .NET 8 + DryIoc)

以下以「创建一个带按钮交互、页面导航的模块化 Prism WPF 应用」为例,完整演示 Prism Template Pack 的模板创建、代码片段使用、模块集成全流程。

一、环境准备

  • Visual Studio 2022(已安装 WPF 工作负载)

  • 已安装 Prism Template Pack 2.2.000+(安装步骤参考前文)

  • .NET 8 SDK

二、步骤 1:用「Prism Blank App」创建主应用

1. 新建空白 Prism 项目

  1. 打开 VS2022 → 「创建新项目」→ 搜索「Prism Blank App」→ 选择模板。

  2. 配置项目信息:

    • 项目名称:PrismTemplateDemo

    • 存储路径:自定义(避免中文路径)

    • 框架:.NET 8

    • 容器:DryIoc(推荐)

    • ViewModel 策略:Auto(默认按命名约定关联)

  3. 点击「创建」,生成基础项目结构。

2. 主窗口布局(MainWindow.xaml)

修改主窗口,添加「导航按钮」和「内容显示区域(Region)」:

复制代码
<Window x:Class="PrismTemplateDemo.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 Template Demo" Height="400" Width="600">
    <Grid>
        <!-- 左侧导航栏 -->
        <StackPanel Width="150" VerticalAlignment="Top" Margin="10" Spacing="10">
            <Button Content="跳转到首页" Command="{Binding NavigateToHomeCommand}" Width="120" Height="40"/>
            <Button Content="跳转到设置页" Command="{Binding NavigateToSettingCommand}" Width="120" Height="40"/>
        </StackPanel>
        
        <!-- Prism 导航区域(承载子页面) -->
        <ContentControl prism:RegionManager.RegionName="MainContentRegion" 
                        Margin="170,10,10,10" Background="#F5F5F5"/>
    </Grid>
</Window>

3. 主窗口 ViewModel(用代码片段快速开发)

打开 ViewModels/MainWindowViewModel.cs,使用 Prism 代码片段生成导航命令:

步骤 1:生成导航服务注入代码

输入 prismnav → 按「Tab 键 2 次」,自动生成导航服务注入模板,修改后如下:

复制代码
using Prism.Mvvm;
using Prism.Commands;
using Prism.Navigation;
​
namespace PrismTemplateDemo.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        // 导航服务(通过Prism依赖注入)
        private readonly INavigationService _navigationService;
​
        // 页面标题(用prismprop片段生成)
        private string _title = "Prism Template Pack 示例";
        public string Title
        {
            get => _title;
            set => SetProperty(ref _title, value);
        }
​
        // 构造函数注入导航服务
        public MainWindowViewModel(INavigationService navigationService)
        {
            _navigationService = navigationService;
            
            // 初始化导航命令(用prismcmd片段生成)
            NavigateToHomeCommand = new DelegateCommand(OnNavigateToHome);
            NavigateToSettingCommand = new DelegateCommand(OnNavigateToSetting);
        }
​
        // 跳转到首页命令
        public ICommand NavigateToHomeCommand { get; }
        private void OnNavigateToHome()
        {
            // 导航到HomeView页面(后续创建)
            _navigationService.NavigateAsync("HomeView");
        }
​
        // 跳转到设置页命令
        public ICommand NavigateToSettingCommand { get; }
        private void OnNavigateToSetting()
        {
            // 导航到SettingView页面(后续创建)
            _navigationService.NavigateAsync("SettingView");
        }
    }
}

代码片段使用说明:

  • prismprop:输入后按 Tab 生成带属性通知的绑定属性(示例中 Title 属性);

  • prismcmd:输入后按 Tab 生成无参数 DelegateCommand(示例中两个导航命令);

  • prismnav:输入后按 Tab 生成导航服务注入模板。

三、步骤 2:用「Prism Module」创建子模块

1. 新建模块项目

  1. 右键解决方案 →「添加」→「新建项目」→ 搜索「Prism Module」→ 选择模板。

  2. 配置模块信息:

    • 项目名称:PrismTemplateDemo.ModuleA

    • 框架:.NET 8

    • 容器:DryIoc(与主应用一致)

    • 模块名:ModuleA(默认)

  3. 点击「创建」,生成模块基础结构。

2. 模块内添加首页(HomeView)

  1. 在 ModuleA 项目中新建「Views」文件夹 → 添加「WPF 用户控件」→ 命名为 HomeView.xaml

  2. HomeView 布局:

复制代码
<UserControl x:Class="PrismTemplateDemo.ModuleA.Views.HomeView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Spacing="20">
            <TextBlock Text="{Binding WelcomeMessage}" FontSize="24" Foreground="#2C3E50"/>
            <Button Content="点击修改文本" Command="{Binding ChangeTextCommand}" Width="150" Height="40"/>
        </StackPanel>
    </Grid>
</UserControl>

3. 首页 ViewModel(用代码片段快速开发)

在 ModuleA 项目中新建「ViewModels」文件夹 → 添加 HomeViewModel.cs

复制代码
using Prism.Mvvm;
using Prism.Commands;
​
namespace PrismTemplateDemo.ModuleA.ViewModels
{
    public class HomeViewModel : BindableBase
    {
        // 用prismprop生成欢迎文本属性
        private string _welcomeMessage = "欢迎来到首页!";
        public string WelcomeMessage
        {
            get => _welcomeMessage;
            set => SetProperty(ref _welcomeMessage, value);
        }
​
        // 用prismcmd生成按钮命令
        public ICommand ChangeTextCommand => new DelegateCommand(OnChangeText);
​
        private void OnChangeText()
        {
            WelcomeMessage = "Prism Template Pack 代码片段真好用!";
        }
    }
}

4. 模块内添加设置页(SettingView)

重复上述步骤,在 ModuleA 中创建 Views/SettingView.xamlViewModels/SettingViewModel.cs

SettingView.xaml
复制代码
<UserControl x:Class="PrismTemplateDemo.ModuleA.Views.SettingView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <TextBlock Text="{Binding SettingMessage}" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center"/>
    </Grid>
</UserControl>
SettingViewModel.cs
复制代码
using Prism.Mvvm;
​
namespace PrismTemplateDemo.ModuleA.ViewModels
{
    public class SettingViewModel : BindableBase
    {
        // 用prismprop生成设置页文本
        private string _settingMessage = "这是设置页面(ModuleA)";
        public string SettingMessage
        {
            get => _settingMessage;
            set => SetProperty(ref _settingMessage, value);
        }
    }
}

5. 配置模块加载(ModuleAModule.cs)

修改模块入口类,注册视图并初始化导航:

复制代码
using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;
using PrismTemplateDemo.ModuleA.Views;
​
namespace PrismTemplateDemo.ModuleA
{
    public class ModuleAModule : IModule
    {
        // 注册模块内的视图(用于导航)
        public void RegisterTypes(IContainerRegistry containerRegistry)
        {
            // 注册HomeView和SettingView到容器
            containerRegistry.RegisterForNavigation<HomeView>();
            containerRegistry.RegisterForNavigation<SettingView>();
        }
​
        // 模块初始化(默认导航到首页)
        public void OnInitialized(IContainerProvider containerProvider)
        {
            var regionManager = containerProvider.Resolve<IRegionManager>();
            // 启动时默认在MainContentRegion显示HomeView
            regionManager.RequestNavigate("MainContentRegion", "HomeView");
        }
    }
}

四、步骤 3:主应用集成模块

1. 引用模块项目

右键主应用 PrismTemplateDemo →「添加」→「项目引用」→ 勾选 PrismTemplateDemo.ModuleA

2. 配置模块加载(App.xaml.cs)

修改主应用的引导类,添加模块加载逻辑:

复制代码
using Prism.DryIoc;
using Prism.Ioc;
using Prism.Modularity;
using PrismTemplateDemo.ModuleA;
using System.Windows;
​
namespace PrismTemplateDemo
{
    public partial class App : PrismApplication
    {
        // 注册服务/视图
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            // 主应用无需额外注册,模块已自行注册
        }
​
        // 创建主窗口
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }
​
        // 配置模块加载
        protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            // 添加ModuleA到模块目录
            moduleCatalog.AddModule<ModuleAModule>();
            base.ConfigureModuleCatalog(moduleCatalog);
        }
    }
}

五、运行效果

  1. 按 F5 启动应用,主窗口默认显示「首页」,文本为「欢迎来到首页!」;

  2. 点击首页的「点击修改文本」按钮,文本变为「Prism Template Pack 代码片段真好用!」;

  3. 点击左侧「跳转到设置页」按钮,内容区域切换为设置页,显示「这是设置页面(ModuleA)」;

  4. 点击「跳转到首页」按钮,内容区域切回首页。

核心知识点总结

  1. 模板优势:Prism Template Pack 自动生成 Prism 核心结构(如 PrismApplication 继承、容器配置),无需手动编写;

  2. 代码片段效率prismprop/prismcmd/prismnav 等片段省去重复编写属性通知、命令、导航代码的工作量;

  3. 模块化开发:Prism Module 模板标准化模块结构,模块可独立开发、插拔式集成到主应用。

此示例覆盖了 Prism Template Pack 的核心用法:空白应用模板、模块模板、代码片段,可直接作为 Prism WPF 项目的基础模板扩展。

相关推荐
棉晗榜1 小时前
wpf 在XAML中配置视图模型,通过 d:DataContext设置设计时类型,方便按F12跳转查看类型
wpf
j***63083 小时前
四大.NET ORM框架深度对比:EF Core、SqlSugar、FreeSql与Dapper的性能、功能与适用场景
.net
赵财猫._.4 小时前
HarmonyOS渲染性能优化:组件树复用与局部刷新机制
wpf·harmonyos·ux
赵财猫._.5 小时前
鸿蒙分布式数据库同步:冲突解决与数据一致性策略
wpf·harmonyos·ux
Macbethad15 小时前
使用WPF编写一个数据记录页面
wpf
我是唐青枫1 天前
C#.NET 范围与索引(Range、Index)完全解析:语法、用法与最佳实践
c#·.net
深海潜水员1 天前
【MonoGame游戏开发】| 牧场物语实现 第一卷 : 农场基础实现 (下)
vscode·游戏·c#·.net·monogame
时光追逐者2 天前
Visual Studio 2026 现已正式发布,更快、更智能!
ide·c#·.net·visual studio