在实际应用开发中,随着项目业务逐渐复杂,耦合度会越来越高,维护成本也会直线上升,所以解耦也变得越来越重要。Prism框架为WPF开发中解耦提供了非常便捷的应用。今天主要以一个简单的小例子,简述WPF开发中Prism框架的简单应用,如有不足之处,还请指正。

什么是Prism?

Prism是一个开源框架,用于在WPF、Xamarin Forms、Uno/Win UI等应用中创建松耦合、可维护、可测试的XAML应用程序。Prism提供了一组设计模式的实现,这些设计模式有助于编写结构良好且可维护的XAML应用程序,包括MVVM,dependency injection,commands,EventAggregator等。

Prism源码库

Prism遵守开源许可协议(MIT),目前最新版本8.1.97,可通过GitHub进行下载最新版本。https://github.com/PrismLibrary

Prism优点

Prism 设计围绕核心建筑设计原则,即关注点分离和松散耦合。这使得Prism可以提供许多好处

  • 重复使用:通过重复使用单元测试的组件,可以通过依赖性注入在运行时间轻松发现和集成,以及通过使用可在应用程序中重复使用的应用程序级功能封装模块,在应用级别实现重复使用。

  • 可扩展性:通过管理组件依赖性、使组件在运行时间更容易集成或替换为替代实现以及提供将应用程序分解为可独立更新和部署的模块的能力,帮助创建易于扩展的应用程序

  • 灵活性:Prism 有助于创建灵活的应用程序,使它们能够随着新功能的开发和集成而更容易更新

  • 团队发展:Prism 有助于最大限度地减少跨团队依赖性,并允许团队专注于不同的功能领域(如 UI 设计、业务逻辑实现和基础架构代码开发),或不同业务级别的功能领域(如简介、销售、库存或物流)。

模块化思想

通过对比发现,采用模块化思想进行设计,使得程序结构清晰,符合高内聚,低耦合的设计风格。

Prism安装

Prism可通过NuGet方案包管理器进行安装,主要安装三个Prism.Core,Prism.Unity,Prism.Wpf

创建模块和视图控件

创建WPF类库,并添加用户控件视图,并采用MVVM开发模式

数据绑定

在Prism框架中,提供了数据绑定基类Prism.Mvvm.BindableBase,可以方便的将普通属性,转换为依赖属性,简化开发中过程中的代码量。

namespace DemoPrism.Second.ViewModels
{internal class SecondViewModel : BindableBase{#region 属性及构造函数private int id;public int Id{get { return id; }set { SetProperty(ref id, value); }}/// <summary>/// 模块间交互/// </summary>private readonly IEventAggregator eventAggregator;public SecondViewModel(IEventAggregator eventAggregator){this.eventAggregator = eventAggregator;this.eventAggregator.GetEvent<DemoOneEvent>().Subscribe(DemoOneRecived);}#endregionprivate void DemoOneRecived(int id){this.Id = id;}}
}

创建Prism模块

添加Module类,并实现Prism.Modularity.IModule接口,实现接口的模块,视为可以被Prism发现并加载的模块。以DefectListModule模块为例:

namespace DemoPrism.First
{public class FirstModule : IModule{public void OnInitialized(IContainerProvider containerProvider){IRegionManager regionManager = containerProvider.Resolve<IRegionManager>();regionManager.RegisterViewWithRegion("FirstRegion", typeof(Views.FirstView));}public void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterForNavigation<Views.FirstView, ViewModels.FirstViewModel>();}}
}

模块配置

Prism提供了多种模块加载方式,常用的有App.config配置文件方法。

  1. 在App.config节点,添加configSections配置,增加modules节点配置

  2. modules节点主要配置需要加载的Prism模块

<?xml version="1.0" encoding="utf-8" ?>
<configuration><configSections><!--prism配置--><section name="modules" type="Prism.Modularity.ModulesConfigurationSection, Prism.Wpf"/></configSections><modules><!--注册模块--><module assemblyFile="Modules\DemoPrism.First.dll" moduleType="DemoPrism.First.FirstModule, DemoPrism.First" moduleName="First" startupLoaded="true" /><module assemblyFile="Modules\DemoPrism.Second.dll" moduleType="DemoPrism.Second.SecondModule, DemoPrism.Second" moduleName="Second" startupLoaded="true" /></modules>
</configuration>

模块加载

模块配置好后,需要在启动的时候,加载模块。修改WPF入口启动程序,App.xaml.cs文件,继承自Prism.Unity.PrismApplication基类,并重写相关初始化

namespace DemoPrism
{/// <summary>/// Interaction logic for App.xaml/// </summary>public partial class App : PrismApplication{//使用容器创建主窗体protected override Window CreateShell() => Container.Resolve<MainWindow>();protected override void ConfigureViewModelLocator(){base.ConfigureViewModelLocator();}protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog){//通过代码的方式添加模块//moduleCatalog.AddModule<NavigationModule.NavigationModule>();//将MedicineModule模块设置为按需加载base.ConfigureModuleCatalog(moduleCatalog);}protected override void RegisterTypes(IContainerRegistry containerRegistry){}protected override IModuleCatalog CreateModuleCatalog(){ConfigurationModuleCatalog configurationModuleCatalog = new ConfigurationModuleCatalog();configurationModuleCatalog.Load();//通过Xaml配置文件读取模块加载信息return configurationModuleCatalog;//return directoryModuleCatalog;}/// <summary>/// 注册适配器(区域容器:Region)/// </summary>/// <param name="regionAdapterMappings"></param>protected override void ConfigureRegionAdapterMappings(RegionAdapterMappings regionAdapterMappings){base.ConfigureRegionAdapterMappings(regionAdapterMappings);}}
}

区域Region

在Prism框架中,模块可以注册到导航菜单Navigation,也可以注册到区域Region,根据实际业务需要进行选择。Region可以更加方便的进行模块化布局等。在普通容器控件中,增加prism:RegionManager.RegionName=”名称”

<Window x:Class="DemoPrism.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:prism="http://prismlibrary.com/"xmlns:local="clr-namespace:DemoPrism"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"prism:ViewModelLocator.AutoWireViewModel="True"><Grid><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><ContentControl Grid.Column="0" prism:RegionManager.RegionName="FirstRegion"></ContentControl><ContentControl Grid.Column="1" prism:RegionManager.RegionName="SecondRegion"></ContentControl></Grid>
</Window>

模块交互

模块与模块之间相互独立,如果需要交互,可以通过事件聚合器IEventAggregator,采用事件的订阅和发布进行通信。

事件订阅步骤:

  1. 定义事件,定义一个类,继承自Prism.Events.PubSubEvent泛型类

  2. 事件发布,通过事件聚合器的Publish方法进行发布。

  3. 事件订阅,通过事件聚合器的Subscribe进行订阅。

namespace DemoPrism.Event
{/// <summary>/// 注册事件/// </summary>public class DemoOneEvent : PubSubEvent<int>{}
}

弹出模态窗口

在Prism框架下,弹出模态窗口,需要以下3个步骤:

  1. 在Prism框架中,页面UserControl实现弹窗功能,被弹出页面需要实现Prism.Services.Dialogs.IDialogAware接口。

  2. 注册窗口,将UserControl注册成窗口。

  3. 调用弹出服务,弹出窗口

源码下载

示例中源码下载,在公众号恢复关键词PRISM,如下所示:

学习编程,从关注【老码识途】开始!!!

WPF开发之Prism详解【内附源码】相关推荐

  1. 【Python】基金/股票 最大回撤率计算与绘图详解(附源码和数据)

    如果你想找的是求最大回撤的算法,请跳转:[Python] 使用动态规划求解最大回撤详解 [Python]基金/股票 最大回撤率计算与绘图详解(附源码和数据) 0. 起因 1. 大成沪深300指数A 5 ...

  2. EKF SLAM Matlab仿真实践详解(附源码)

    EKF SLAM Matlab仿真实践详解(附源码) 为提供更好的阅读体验,详细内容及源码请移步https://github.com/Nrusher/EKF_SLAM 或 https://gitee. ...

  3. JAVA文件上传详解(附源码)

    文章目录 JAVA文件上传详解(附源码) 1.准备工作 2.使用类介绍 FileItem类 ServletFileUpload类 3.代码编写 JAVA文件上传详解(附源码) 在web应用中,文件上传 ...

  4. Spring Cloud限流详解(附源码)

    在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...

  5. FPGA--简易DDS信号发生器 (内涵DDS与CORDIC IP核详解)附源码

    学习内容 简易DDS信号发生器的设计与验证,产生所需的正弦波.方波锯齿波,并进行verilog验证. 实现功能 可以通过按键控制来输出不同的波形. 开发环境 xilinx spartan6开发板.IS ...

  6. android SQLite数据库用法图文详解(附源码)

    (转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 SQLite是嵌入式设备使用的一种轻量型数据库.可以通过执行sql语句对数据库进行操作,android ...

  7. 【Java 代码实例 14】BeanUtils用法详解,附源码分析

    目录 一.org.apache.commons.beanutils.BeanUtils简介 二.使用的前置条件 三.添加pom 四.org.apache.commons.beanutils.BeanU ...

  8. C语言制作个人通讯录管理系统—超详解(附源码)

    之前利用C语言完成了一个关于个人通讯录管理系统的课题,主要是关于联系人的添加.查找.删除.修改.输出以及文件的写入与读出,还有一个甜点功能-模拟通话,它的实现原理也很容易理解,文章末尾会介绍到. 主框 ...

  9. Qt 零基础设计实现TCP服务器和客户端上位机(零基础实战详解,附源码文件)

    文章目录 TCP和UDP TCP的三次握手和四次分手 TCP和UDP的区别 关于Socket(套接字) Qt TCP服务器的设计与实现 使用Qt的 帮助 TCP服务器和客户端 区别 UI界面设计和原则 ...

最新文章

  1. 基础认证伪造工具phishery
  2. GDB attach 用法
  3. Qt Creator将UI项目转换为应用程序
  4. 《力学》课时三常见力和牛顿三定律
  5. 概率论与数理统计 重点篇
  6. html播放优酷链接视频教程,视频教程链接(请将网址复制粘贴到浏览器地址栏查看):...
  7. 杭州电子科技大学操作系统课程设计:简单文件系统的实现
  8. 联想计算机M.2固态银盘,联想ThinkPad T14拆机加装内存和M.2固态硬盘
  9. HGET key field
  10. LM2596DC -DC模块测试记录
  11. iapp禁止抓包软件代码
  12. 关于 Swap file “~.bash_profile.swp“ already exists (已解决)
  13. Android cer转bks
  14. linux内核源码漫游,Linux内核源代码漫游
  15. android吉他谱组件,Android - 自定义View 实现 文本吉他谱的 动态控制 实现
  16. 探索C# : List 元素类型和清除方法
  17. 数据结构与算法之左高树
  18. maters鸿蒙系统,【华为MateRS保时捷版评测】系统:多元素化集合EMUI 8.1体验很棒-中关村在线...
  19. 云看大熊猫,动物园如何利用视频技术玩转动物IP?
  20. 半导体工艺1:课程和书籍

热门文章

  1. 每次访问某个界面,展示欢迎回来,并展示上次访问时间
  2. visual studio 2010卸载
  3. C++程序设计基础案例教程pdf
  4. 知识点滴 - 自行车分类
  5. 【Mac小白必备】MacOS中Dock栏的设置和使用技巧
  6. Flutter 学习第三天 面向对象 和 库的使用
  7. 用JavaScript写一个类似于windows的气泡屏保效果
  8. tp6_layui_01_登录页面的实现
  9. 基于单片机的存钱罐系统设计(#0465)
  10. 讲解TIDB中官网没有详细解释的地方