WPF开发之Prism详解【内附源码】

这篇具有很好参考价值的文章主要介绍了WPF开发之Prism详解【内附源码】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在实际应用开发中,随着项目业务逐渐复杂,耦合度会越来越高,维护成本也会直线上升,所以解耦也变得越来越重要。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

WPF开发之Prism详解【内附源码】

Prism优点

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

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

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

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

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

 文章来源地址https://www.toymoban.com/news/detail-414881.html

模块化思想

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

WPF开发之Prism详解【内附源码】 WPF开发之Prism详解【内附源码】

 

 

Prism安装

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

 

WPF开发之Prism详解【内附源码】

创建模块和视图控件

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

WPF开发之Prism详解【内附源码】

WPF开发之Prism详解【内附源码】

 

数据绑定

在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);
        }
        #endregion
        private 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基类,并重写相关初始化

WPF开发之Prism详解【内附源码】

 

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=”名称”

WPF开发之Prism详解【内附源码】

<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详解【内附源码】

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

 

到了这里,关于WPF开发之Prism详解【内附源码】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Wpf 使用 Prism 实战开发Day01

    1.  VisualStudio 2022 2.  . NET SDK 7.0 3.  Prism 版本 8.1.97 以上环境,如有新的版本,可自行选择安装新的版本为主 项目名称:这里只是记录学习,所以随便命名都无所谓,只要觉得合理就行 注意: 下载的包名是 Prism.DryIoc 。为什么不是Prism.xxx其他包,而是 Prism.DryIoc ,别问我,我也不

    2024年02月08日
    浏览(29)
  • Wpf 使用 Prism 实战开发Day10

    1-9章节已经把基本功能都做好了,但页面的数据是后台模拟生成的静态数据。接下来所有章节就是实现,页面的所有数据都是从数据库中获取,并且实现页面数据的持久化以及增删改查。 使用Sqlite 做为数据库  1.打开 MyToDo.Api项目,右键=》选择 管理NuGet 程序包 ,进行下载安

    2024年01月25日
    浏览(33)
  • Wpf 使用 Prism 实战开发Day08

    1.效果图 MemoView.xaml 页面代码      1. 在  ItemsControl 中,添加滚动条  ScrollViewer  这样使用 ScrollViewer 把内容区域包裹起来,就能让内容区域支持滚动了        2 . 添加滚动条后的效果图如下:  使用md 中的一个自带动画 md:TransitioningContent 来实现该功能  需要设置一个属性,

    2024年02月03日
    浏览(27)
  • Wpf 使用 Prism 实战开发Day02

    导航条的样式,主要是从Material DesignThemes UI 拷贝过来修改的,项目用了这个UI组件库,就看自己需要什么,就去拷过来使用,界面布局或其他组件使用,不做介绍。 直接下载源码,编译运行就可以看到Demo 了 反正我下载完且编译后是能正常跑起来,没有办法跑起来的,找找自

    2024年02月06日
    浏览(31)
  • Wpf 使用 Prism 实战开发Day13

    在上一节  ToDoController 控制器,或 IToDoService 服务接口中,方法的传参都是直接传的实体类。但在实际开发过程中,这样是不允许的。标准且规范的做法是,定义一个数据传输层,即Dto层。 1. 创建 BaseDto 基类,用于存放共用属性。 2. 创建待办事项 Dto类,并继承自 BaseDto 基类

    2024年01月20日
    浏览(36)
  • Wpf 使用 Prism 实战开发Day19

    由于待办事项功能页,数据已正常渲染出来了。但页面新增,查询,修改,删除等功能还未实现。本章节来实现页面的请求后台实现CURD(增删改查) 根据渲染出来的待办事项,点击对应的待办事项时,查找出该条数据,显展示在编辑窗口中。 同时在搜索框中输入的参数或选

    2024年04月23日
    浏览(26)
  • WPF开发学生信息管理系统【WPF+Prism+MAH+WebApi】(四)

    最近通过WPF开发项目,为了对WPF知识点进行总结,所以利用业余时间,开发一个学生信息管理系统【Student Information Management System】。前三篇文章进行了框架搭建和模块划分,后台WebApi接口编写,以及课程管理模块开发,本文在前三篇基础之上,继续深入开发学生信息管理系统

    2024年02月04日
    浏览(35)
  • 基于Prism框架的WPF前端框架开发《知产代理数字化解决方案》

    最近新开发了一套WPF前端界面框架,叫《知产代理数字化解决方案》,采用了时下流行的Prism框架作为整个系统的基础架构,演示了Prism中的IRegionManager区域管理器、IDialogAware对话框、IDialogService对话框服务、IContainerExtension容器等用法。 系统对常用的控件进行了模板和样式开发

    2024年01月19日
    浏览(47)
  • 实际开发中,React应用常见问题【持续更新中】

    实际开发中,React应用常见问题【持续更新中】 “react-router-dom”: “^6.14.2”, “react”: “^18.2.0”, 1、监听路由 2、路由编程式导航 useNavigate() 3、路由链接导航

    2024年02月15日
    浏览(40)
  • Shell脚本开发:printf和test命令的实际应用

    目录 Shell printf 命令 打印简单文本 Shell test 命令 1、文件测试 2、字符串比较 3、整数比较 逻辑运算: 当你使用Shell中的printf命令时,它可以帮助你格式化和输出文本。 打印简单文本 这将简单地打印字符串\\\"Hello, World!\\\",并在末尾添加一个换行符n来换行。 当你使用Shell中的t

    2024年02月10日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包