WPF学习之Prism(二)

前言

学习一下Prism。

1.Prism

Prism框架提供了一套丰富的工具、类和模块,帮助开发人员实现以下功能:

  • 模块化:Prism框架支持将应用程序拆分为多个模块,每个模块具有自己的功能和视图。这种模块化的设计使得应用程序更加灵活和可扩展。
  • 导航:Prism框架提供了导航功能,可以方便地在不同的视图之间进行导航和交互。开发人员可以定义导航路径和参数,以及处理导航事件。
  • 依赖注入:Prism框架内置了一个轻量级的依赖注入容器,可以帮助开发人员管理和解决组件之间的依赖关系。这样可以提高代码的可测试性和可维护性。
  • 事件聚合器:Prism框架提供了一个事件聚合器,可以帮助不同模块之间进行解耦和通信。开发人员可以通过发布和订阅事件来实现模块之间的交互。
  • 命令绑定:Prism框架支持命令绑定,可以将用户操作和后台逻辑进行绑定。这样可以更好地分离用户界面和业务逻辑。
  • 可测试性:Prism框架的设计考虑了应用程序的可测试性,提供了一些工具和模式,帮助开发人员编写可测试的代码。

1.1创建WPF

创建WPF程序,我是基于net8框架创建。

image-20240326213002184

安装包

Prism.DryIoc

image-20240326213043243

修改App.xaml

继承PrismApplication并实现CreateShell(设置启动页)、RegisterTypes(注册服务)

因为即设置了启动页,也设置了StartupUri,所以弹出了俩个窗体。

image-20240326213846042

1.2创建Prism

打开vs,我的是vs2022,管理扩展

image-20240326214451835

查找Prism,安装 Prism Template Pack

image-20240326214530471

安装完后,关闭所有vs,再打开就会自动修改vs2022的配置,等待修改完毕即可

image-20240326214636635

创建WPF Prism Full项目

image-20240326214744071

选择DryIoc

image-20240326214957745

创建成功

image-20240326215026523

2.Prism区域

2.1实现区域切换

创建ViewModels、Views文件夹内,注意名称,容器就是根据命名空间找到对应的类。

新建三个用户控件,并在App注入服务。

image-20240326223952386

需要修改MainWindow的命名空间,加上Views,要不容器无法找到,算是一个小坑。

MainWindow加上几个按钮和ContentControl用于区域切换。

button加上参数,用于后台命令根据名称切换界面。

prism:ViewModelLocator.AutoWireViewModel="True"。

image-20240326224304070

MainWindowViewModel实现BindableBase。

实现显示内容命令(DelegateCommand),根据前台传入的参数显示区域。

image-20240326224437753

2.2解耦优化

注入IRegionManager(区域管理),通过IRegionManager去实例化用户控件。

image-20240326225710679

App重载一下RegisterForNavigation。

如果不想使用别名需要全名,这里使用别名。

image-20240326225901070

3.Prism模块化

3.1引用模块

创建WPF程序模块A和模块B

image-20240327213111948

image-20240327213219150

删除WPF程序自带的一些文件。

image-20240327213316334

然后把Peng.MoudleA和Peng.MoudleB输出类型改为类库。

image-20240327215255938

为什么创建WPF程序而不是类库?

因为类库不能添加WPF窗口、用户控件等文件,项目需要加载模块的窗口、用户控件等。

image-20240327213440234

ModuleA、ModuleB都引用Prism.DryIoc。

  <ItemGroup><PackageReference Include="Prism.DryIoc" Version="8.1.97" /></ItemGroup>

image-20240327213901228

实现IModule,把MoudleA和MoudleB注入到IOC容器中。

image-20240327224507716

主程序引入MoudleA和MoudleB,并且改变命令参数为MoudleAUC、MoudleBUC,此名称对应模块中用户控件名称。

image-20240327215936789

在主程序添加MoudleA和MoudleB。

image-20240327220104855

3.2动态加载

添加Modules文件夹,并且把生成后的MoudleA和MoudleB移到Modules文件夹下。

image-20240327220447281

选择Peng.MoudleA.dll和Peng.MoudleBdll修改属性始终复制。

image-20240327220531072

主程序不用引入Peng.MoudleA和Peng.MoudleB了,会动态加载Modules目录下的dll。

image-20240327220752547

4.导航

4.1传参

ViewModelLocator.AutoWireViewModel="True"可以通过命名的形式让控件找到对应的视图,但是一旦名字写错就容易找不到,所以一般不建议这么使用,可以注入的时候指定控件和视图。

image-20240327224834978

通过添加NavigationParameters字典传参。

image-20240327225043595

ModuleAUCViewModel需要实现INavigationAware。

通过判断是否存在Key获取参数值,然后双向绑定显示界面。

image-20240327225129796

重新生成后,记得替换Modules目录下的dll。

image-20240327225919401

4.2导航后退

增加后退按钮,绑定后退命令。

image-20240327230002940

实现后退命令。

第一次加载的时候Journal为null,所以需要判断非null。

image-20240327230055089

传参数的时候需要添加导航记录。

image-20240327230119109

实现IConfirmNavigationRequest,这里不需要INavigationAware,因为IConfirmNavigationRequest继承了INavigationAware

image-20240327230213424

5.Prism对话框

新建Peng.MoudleC用于对话框服务。

简单写一下界面,一个Title,一个显示获取的参数,还有俩个按钮。

ModuleCUCViewModel实现BindableBase、IDialogAware。

BindableBase用于和界面绑定。

IDialogAware是对话框服务。

image-20240328153455116

实现IDialogAware几个方法。

RequestClose是返回对话框状态,在确定和取消命令的时候返回结果。

在OnDialogOpened时获取传入的参数。

在Confirm时返回参数。

image-20240328153730624

最后显示注入对话框服务。

image-20240328154012624

主界面添加一个按钮和一个文本框用于打开对话框和显示对话框传入的参数。

添加ShowDialogCmd显示对话框命令。

添加DialogService对话框服务。

在DialogService.ShowDialog回调函数中获取对话框返回结果。

image-20240328154141212

重新生成后记得改Peng.MoudleC.dll属性为始终复制。

image-20240328154455855

6.发布订阅

实现PubSubEvent,T是订阅方法的参数类型。

image-20240328214601864

代码比较简单,简单赘述一下。

主界面添加三个按钮:发布、订阅、取消订阅,绑定三个命令。

IEventAggregator是发布订阅的服务,默认已经注入,可以通过构造函数方式获取即可。

Publish:发布事件。

Subscribe:订阅事件。

CancelSub:取消订阅。

image-20240328214342252

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/896406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【EB-03】 AUTOSAR builder与EB RTE集成

AUTOSAR builder与EB RTE集成 1. Import Arxml files to Tresos2. Run MultiTask Script3. Add Components3.1 Run EcuExtractCreator Script4. Mapping Component to Partitions5. Event Mapping/Runnables Mapping to Tasks6. Port Connect7. Run SvcAs_Trigger Script8. Ver…

算法教程:香槟塔问题

香槟塔问题 问题描述 我们将玻璃杯堆成金字塔状,第一排有 1 个玻璃杯,第二排有 2 个玻璃杯,依此类推,直到第 100 排。每个玻璃杯装一杯香槟。 然后,将一些香槟倒入最上面的第一个玻璃杯中。当最上面的玻璃杯装满时,任何多余的液体都会均匀地落到它左右两侧的玻璃杯上。当…

FastJSON 默认行为:JSON.toJSONString 忽略 null 字段

完整的 FakeRegistrationController 代码&#xff0c;这让我可以全面分析后端逻辑&#xff0c;特别是为什么空的字段&#xff08;如 compareDate&#xff09;不返回给前端。我将详细分析代码的每个接口&#xff0c;尤其是与 list 请求和字段返回相关的部分&#xff0c;并解释原…

大模型基础概念之神经网络宽度

在大模型中,神经网络宽度是提升模型容量的核心手段之一,与深度、数据规模共同构成性能的三大支柱。合理增加宽度可显著增强模型表达能力,但需结合正则化、硬件优化和结构设计进行平衡。未来趋势可能包括动态宽度调整、稀疏化宽度设计(如MoE)以及更高效宽度-深度复合缩放策…

在Linux环境下利用MTCNN进行人脸检测(基于ncnn架构)

概述 本文将详细介绍如何在Linux环境下部署MTCNN模型进行人脸检测&#xff0c;并使用NCNN框架进行推理。 1. CMake的安装与配置 下载CMake源码 前往CMake官网下载&#xff0c;找到适合您系统的最新版本tar.gz文件链接&#xff0c;或者直接通过wget下载&#xff1a;CMake官方…

算法day1 dfs搜索2题

一 火星人 拿到这种类似于排序的&#xff0c;这个就好比如我们之前学习dfs基础的时候里面的指数型枚举 指数型枚举数据与数据之间没有任何枚举&#xff0c;就比如选这个数字与不选组合型枚举数据与数据之间有联系&#xff0c;下一个数字不可以给上一个数字排列型枚举数据与数…

CC攻击防御策略全解析:技术实现与代码示例

CC攻击&#xff08;Challenge Collapsar&#xff09;是一种以消耗服务器资源为目标的分布式拒绝服务攻击&#xff08;DDoS&#xff09;&#xff0c;其特点在于攻击流量伪装成合法请求&#xff0c;难以通过传统防火墙完全防御。本文将从技术实现角度详细解析CC攻击的防御策略&am…

(九)axios的使用

1、axios 的基本使用 1.1、简介 在 Web 开发的演进历程中&#xff0c;数据请求方式的变革至关重要。回溯早期&#xff0c;旧浏览器在向服务器请求数据时&#xff0c;存在严重弊端。由于返回的是整个页面数据&#xff0c;每次请求都会导致页面强制刷新&#xff0c;这不仅极大地…

【MySQL篇】数据库基础

目录 1&#xff0c;什么是数据库&#xff1f; 2&#xff0c;主流数据库 3&#xff0c;MySQL介绍 1&#xff0c;MySQL架构 2&#xff0c;SQL分类 3&#xff0c;MySQL存储引擎 1&#xff0c;什么是数据库&#xff1f; 数据库&#xff08;Database&#xff0c;简称DB&#xf…

网络安全事件研判

&#x1f345; 点击文末小卡片 &#xff0c;免费获取网络安全全套资料&#xff0c;资料在手&#xff0c;涨薪更快 研判&#xff08;入侵检测&#xff09; 研判我理解为人工层面对入侵检测事件进行再分析&#xff0c;即借助已有的设备告警根据经验判断是否为真实action 研判工作…

python整理文件下

我们使用 os.path.join() 函数拼接出文件要移动的目标地址。 并使用 os.path.exists() 函数配合 not 关键字找到未创建的文件夹。 这节课&#xff0c;我们会先创建文件夹&#xff0c;然后再移动文件到目标文件夹。如果文件夹不存在&#xff0c;我们需要先创建文件夹&#xff…

hackmyvm-buster

题目地址 信息收集 主机发现 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: C…

FS800DTU联动OneNET平台数据可视化View

目录 1 前言 2 环境搭建 2.1 硬件准备 2.2 软件环境 2.3 硬件连接 3 注册OneNET云平台并建立物模型 3.1 参数获取 3.2 连接OneNET 3.3上报数据 4 数据可视化View 4.1 用户信息获取 4.2 启用数据可视化View 4.3 创建项目 4.4 编辑项目 4.5 新增数据源 4.6 数据过滤器配置 4.6 项…

Dockerfile 中的 COPY 语句:作用与使用详解

在 Docker 的构建过程中&#xff0c;Dockerfile 是一个核心文件&#xff0c;它定义了镜像的构建步骤和内容。其中&#xff0c;COPY 语句是一个非常重要的指令&#xff0c;用于将文件或目录从构建上下文&#xff08;通常是 Dockerfile 所在的目录及其子目录&#xff09;复制到容…

大白话Vuex 核心概念(state、mutations、actions)的使用案例与原理

大白话Vuex 核心概念&#xff08;state、mutations、actions&#xff09;的使用案例与原理 Vuex是Vue.js应用程序中专门用来管理状态的工具&#xff0c;就好像是一个大管家&#xff0c;帮你把项目里一些重要的数据和操作管理得井井有条。下面用大白话结合案例来介绍Vuex核心概…

机器学习介绍与数据集

一、机器学习介绍与定义 1.1 机器学习定义 机器学习&#xff08;Machine Learning&#xff09;是让计算机从数据中自动学习规律&#xff0c;并依据这些规律对未来数据进行预测的技术。它涵盖聚类、分类、决策树、贝叶斯、神经网络、深度学习&#xff08;Deep Learning&#xf…

大模型训练——pycharm连接实验室服务器

一、引言 我们在运行或者复现大佬论文代码的时候&#xff0c;笔记本的算力不够&#xff0c;需要使用实验室的服务器进行运行。可以直接在服务器的终端上执行&#xff0c;但是这样的话代码调试就不方便。而我们可以使用 pycharm 连接到服务器&#xff0c;既方便了代码调试&…

【Linux】进程优先级 | 进程调度(三)

目录 前言&#xff1a; 一、进程优先级&#xff1a; 1.通过nice值修改优先级&#xff1a; 二、进程切换&#xff1a; 三、上下文数据 四、Linux真实调度算法&#xff1a; 五、bitmap位图&#xff1a; 六、命令总结&#xff1a; 总结&#xff1a; 前言&#xff1a; 我…

【redis】数据类型之hyperloglog

Redis的HyperLogLog&#xff08;HLL&#xff09;是一种高效的概率数据结构&#xff0c;也是一种基于字符串的数据结构&#xff0c;用于估计大数据集的唯一元素数量&#xff08;基数统计&#xff09;。它通过极低的内存占用&#xff08;约 12KB&#xff09;实现接近线性的时间复…

【C语言】第八期——指针、二维数组与字符串

目录 1 初始指针 2 获取变量的地址 3 定义指针变量、取地址、取值 3.1 定义指针变量 3.2 取地址、取值 4 对指针变量进行读写操作 5 指针变量作为函数参数 6 数组与指针 6.1 指针元素指向数组 6.2 指针加减运算&#xff08;了解&#xff09; 6.2.1 指针加减具体数字…