news 2026/7/24 17:52:48

WPF Prism9 模块化实战学习笔记1(\.NET10\+DryIoc)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WPF Prism9 模块化实战学习笔记1(\.NET10\+DryIoc)

WPF Prism9 模块化实战学习笔记1-框架初体验

前言

本文基于原生WPF项目一步步手动集成Prism9框架,完整实现:项目搭建、模块化拆分、MVVM架构、Region区域导航、模块解耦开发,全程记录实操步骤,适合新手入门学习Prism核心原理。

开发环境:Visual Studio 2026、.NET 10、Prism 9.0.537、DryIoc依赖注入容器

一、创建原生WPF项目

为了清晰看到每一步Prism改造细节,我们不使用Prism模板,先创建无任何框架依赖的原生WPF项目。

1.1 新建WPF应用

打开Visual Studio,选择【创建新项目】,搜索关键词WPF,选择C# WPF 应用程序

💡 重要区分

WPF 应用程序:基于 .NET/.NET Core 现代框架(本次使用)

WPF 应用程序(.NET Framework):传统老旧框架,不推荐使用

1.2 配置项目信息

项目名称命名为PrismDemo,自定义存储路径,取消勾选【将解决方案和项目放在同一目录中】,方便后续拆分多模块、多类库。

1.3 选择框架版本

统一选择.NET 10.0 长期支持版本,保证项目版本统一,规避后续NuGet依赖冲突。

1.4 初始项目结构说明

创建完成后是纯净原生WPF工程,仅包含App.xamlMainWindow.xaml

二、搭建模块化架构,创建业务模块

Prism最核心的特性就是模块化开发,可以将大型项目按业务拆分多个独立模块,实现代码解耦、按需加载、团队协作开发。

2.1 创建解决方案文件夹

在解决方案右键 → 添加 → 新建解决方案文件夹,命名为Modules,用于统一管理所有业务模块类库。

2.2 创建WPF模块类库

在Modules文件夹下右键新建项目,选择WPF类库,命名为ModuleA,框架版本同样选择.NET10,与主项目保持一致。

⚠️ 注意事项

模块需要承载XAML视图页面,必须选择【WPF类库】,不能选择普通控制台类库,否则无法创建用户控件。


三、规范模块结构,引入Prism依赖

3.1 清理默认文件

删除/重命名模块默认生成的Class1.cs,后续替换为Prism模块入口类。

3.2 安装Prism核心NuGet包

右键ModuleA项目 → 管理NuGet程序包,浏览安装Prism.Wpf

作用:提供Prism MVVM、模块接口、导航注册、事件聚合器等核心API。

3.3 规范模块目录分层

遵循标准MVVM架构,在ModuleA中创建两个核心文件夹:

  • Views:存放所有页面、用户控件(视图层)

  • ViewModels:存放视图对应业务逻辑(逻辑层)

3.4 创建视图与ViewModel

  1. 在Views文件夹添加【用户控件WPF】,命名为UserControlA.xaml

  2. 在ViewModels文件夹添加对应实体类,命名为UserControlAViewModel.cs

四、编写模块核心代码,实现Prism模块化

4.1 模块入口类(实现IModule接口)

上文3.1重命名默认类为ModuleA.cs,实现Prism的IModule接口,完成视图导航注册。

usingPrism.Ioc;usingPrism.Modularity;usingPrism.Regions;usingModuleA.Views;namespaceModuleA{publicclassModuleA:IModule{privatereadonlyIRegionManager_regionManager;publicModuleA(IRegionManagerregionManager){_regionManager=regionManager;}// 实现接口自动生成的publicvoidOnInitialized(IContainerProvidercontainerProvider){}// 实现接口自动生成的publicvoidRegisterTypes(IContainerRegistrycontainerRegistry){// 将当前用户控件注册为可导航页面containerRegistry.RegisterForNavigation<UserControlA>();}}}

4.2 编写模块视图页面

修改UserControlA.xaml,编写测试页面布局:

<UserControlx:Class="ModuleA.Views.UserControlA"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:local="clr-namespace:ModuleA.Views"mc:Ignorable="d"d:DesignHeight="450"d:DesignWidth="800"><GridBackground="LightPink"><TextBlockText="这是模块A的内容"HorizontalAlignment="Center"VerticalAlignment="Center"FontSize="20"/></Grid></UserControl>

4.3 编写ViewModel(继承BindableBase)

Prism封装了BindableBase,原生实现属性通知,替代传统INotifyPropertyChanged,简化MVVM开发。

usingPrism.Mvvm;namespaceModuleA.ViewModels{publicclassUserControlAViewModel:BindableBase{}}

💡 Prism自动绑定规则

视图名:UserControlA→ 对应ViewModel:UserControlAViewModel

一定要满足命名约定,Prism才会自动绑定DataContext,无需手动配置

五、改造主项目,引用项目ModuleA,接入Prism框架

在主项目中引用项目ModuleA,点击PrismDemo项目–右键–添加–项目引用

5.1 主项目安装容器依赖

主项目PrismDemo安装NuGet包:Prism.DryIoc

Prism9不再内置容器,需手动指定DryIoc,该包已内置Prism.Wpf,无需重复安装。

5.2 改造App.xaml

将原生Application替换为PrismApplication,引入Prism命名空间:

<prism:PrismApplicationx:Class="PrismDemo.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:PrismDemo"xmlns:prism="clr-namespace:Prism.DryIoc;assembly=Prism.DryIoc"><prism:PrismApplication.Resources></prism:PrismApplication.Resources></prism:PrismApplication>

5.3 改造App.xaml.cs(重写Prism生命周期)

usingPrism.DryIoc;usingPrism.Ioc;usingPrism.Modularity;usingPrismDemo.Views;usingModuleA;usingSystem.Windows;namespacePrismDemo{publicpartialclassApp:PrismApplication{// 指定程序启动主窗口protectedoverrideWindowCreateShell(){returnContainer.Resolve<MainWindow>();}// 全局服务、弹窗、共享视图注册protectedoverridevoidRegisterTypes(IContainerRegistrycontainerRegistry){}// 配置需要加载的业务模块,实现模块集成protectedoverridevoidConfigureModuleCatalog(IModuleCatalogmoduleCatalog){moduleCatalog.AddModule<ModuleA.ModuleA>();}}}

5.4 主窗口定义Prism导航区域Region

修改MainWindow.xaml,定义可承载模块页面的导航区域:

<Windowx:Class="PrismDemo.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:PrismDemo"xmlns:prism="clr-namespace:Prism.Regions;assembly=Prism.Wpf"mc:Ignorable="d"Title="MainWindow"Height="450"Width="800"><DockPanel><StackPanelOrientation="Horizontal"DockPanel.Dock="Top"><ButtonContent="加载模块A"Command="{Binding LoadModuleACommand}"Margin="5"/></StackPanel><!-- Prism导航区域,名称MainRegion,用来承载模块内视图 --><ContentControlprism:RegionManager.RegionName="MainRegion"/></DockPanel></Window>

5.5 主窗口ViewModel实现导航逻辑

新建MainWindowViewModel,通过IRegionManager实现页面导航:

usingPrism.Commands;usingPrism.Mvvm;usingPrism.Regions;namespacePrismDemo.ViewModels{publicclassMainWindowViewModel:BindableBase{privatereadonlyIRegionManager_regionManager;publicDelegateCommandLoadModuleACommand{get;}publicMainWindowViewModel(IRegionManagerregionManager){_regionManager=regionManager;LoadModuleACommand=newDelegateCommand(()=>{// 导航到指定区域、指定视图_regionManager.RequestNavigate("MainRegion","UserControlA");});}}}

六、完整项目总体结构

、完整项目总体结构

解决方案 PrismDemo ├── 【解决方案文件夹】Modules │ └── ModuleA (WPF类库 .NET 10) │ ├── Views │ │ └── UserControlA.xaml │ ├── ViewModels │ │ └── UserControlAViewModel.cs │ └── ModuleA.cs │ └── PrismDemo (WPF主启动程序 .NET 10,Shell外壳) ├── App.xaml / App.xaml.cs ├── MainWindow.xaml / MainWindow.xaml.cs └── ViewModels └── MainWindowViewModel.cs

七、项目职责与运行流程总结

7.1 项目分工

  • PrismDemo(Shell主外壳):程序入口、定义导航区域、统一加载所有模块、全局导航控制

  • ModuleA(业务模块):独立业务单元,自主注册视图,与主程序完全解耦

7.2 程序运行链路

  1. 程序启动 →App.CreateShell()创建主窗口

  2. ConfigureModuleCatalog.AddModule<ModuleA>()加载业务模块

  3. 执行ModuleA.RegisterTypes(),注册UserControlA为导航视图

  4. 界面按钮触发命令 →IRegionManager.RequestNavigate("MainRegion", "UserControlA")

  5. Prism 在MainRegion区域内实例化并显示模块 A 页面

八、运行结果

运行结果.gif为什么在这里不显示😭😭😭

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 17:50:24

跑通 Demo 只是热身:为什么权限与日志才是你进大模型产线的生死线?

聊《我重新梳理AI大模型就业后&#xff0c;先删掉了这些无效投入》之前&#xff0c;先说一句实在的&#xff1a;别急着背概念&#xff0c;先看它在真实项目里到底解决什么问题。摘要摘要 很多初级和大模型方向求职者在面试中最大的误区&#xff0c;是把“能运行”等同于“能上线…

作者头像 李华
网站建设 2026/7/24 17:48:45

生成式AI搜索营销的合规技术与GEO数据治理

1. 项目背景与行业现状2026年的生成式AI搜索营销领域正在经历一场深刻的变革。过去三年里&#xff0c;AI生成内容在搜索引擎结果页面(SERP)中的占比从2023年的12%激增至2026年的47%&#xff0c;这种爆炸式增长带来了前所未有的机遇与挑战。作为从业者&#xff0c;我亲眼见证了行…

作者头像 李华
网站建设 2026/7/24 17:47:22

深入解析ADC32RF42:时钟、SYSREF同步与DDC链实战指南

1. 项目概述与核心价值在雷达、卫星通信和高端测试测量这些对信号完整性要求极高的领域&#xff0c;高速模数转换器&#xff08;ADC&#xff09;的性能直接决定了整个系统的“天花板”。我们常常把ADC比作系统的“感官”&#xff0c;它负责将现实世界中的连续模拟信号&#xff…

作者头像 李华
网站建设 2026/7/24 17:42:44

Kimi K3 深度测评:2.8 万亿参数之后,它真的站上第一梯队了吗?

AI 前沿测评 2026.07三张真实测试截图&#xff0c;拆解编码、智能体、长上下文与独立榜单表现先说结论&#xff1a;Kimi K3 已经进入全球前沿模型梯队&#xff0c;强项不是“更会聊天”&#xff0c;而是能把编码、搜索、表格、研究和多模态串成长链路任务。但它并非全项目第…

作者头像 李华
网站建设 2026/7/24 17:42:07

如何3分钟破解微信聊天记录加密:本地解密终极方案

如何3分钟破解微信聊天记录加密&#xff1a;本地解密终极方案 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾经想要备份自己的微信聊天记录&#xff0c;却发现数据库文件被加密得像一座数字堡垒…

作者头像 李华
网站建设 2026/7/24 17:41:50

Unity中UniVRM插件全流程应用指南:从导入到交互式角色开发

1. 项目概述&#xff1a;为什么UniVRM是Unity虚拟角色创作的“瑞士军刀”&#xff1f; 如果你在Unity里折腾过3D角色&#xff0c;尤其是想搞点二次元风格或者虚拟主播&#xff08;Vtuber&#xff09;那种&#xff0c;那你大概率听说过VRM格式。VRM本质上是一个基于glTF 2.0的开…

作者头像 李华