快速上手Prism WPF 工程

1、Prism 介绍

  • 定位​:
    Prism 是 ​微软推出的框架,专为构建 ​模块化、可维护的复合式应用程序​ 设计,主要支持 WPF、Xamarin.Forms、UWP 等平台。
  • 核心功能​:
    • 模块化开发​:将应用拆分为独立模块,按需加载。
    • 导航管理​:处理页面导航和参数传递。
    • 事件聚合​:通过事件总线实现松耦合的组件通信。
    • 依赖注入集成​:支持多种 DI 容器(如 Unity、DryIoc、Autofac)。
  • 与 DI 容器的关系​:
    Prism ​不直接提供 DI 容器,但提供接口(IContainerRegistry 和 IContainerProvider)来集成第三方容器(如 Unity 或 DryIoc)。

2、Prims 模版扩展安装

在Visual Studio 2022 管理扩展中加载

3、Prism - Unity 和 DryIoc选择

 Unity

  • 定位​:
    Unity 是 ​微软开发的依赖注入容器,属于 Enterprise Library 的一部分,功能全面但较为重量级。
  • 核心功能​:
    • 依赖注入​:支持构造函数注入、属性注入、方法注入。
    • 生命周期管理​:单例、瞬态、作用域等生命周期控制。
    • 扩展性​:支持自定义扩展(如拦截器、策略)。
  • 性能​:
    早期版本性能较低,但最新版本(Unity 5+)已优化。
  • 适用场景​:
    适合企业级应用,尤其是需要复杂依赖管理和扩展性的项目。

DryIoc

  • 定位​:
    DryIoc 是 ​轻量级、高性能的依赖注入容器,以极快的解析速度著称。
  • 核心功能​:
    • 极速解析​:通过优化代码生成和缓存实现高性能。
    • 简洁 API​:配置简单,学习成本低。
    • 零依赖​:无外部库依赖,适合轻量化项目。
    • 高级功能​:支持条件注册、装饰器、元数据等。
  • 性能​:
    在基准测试中通常比 Unity 快 2-10 倍。
  • 适用场景​:
    适合对性能敏感的应用(如游戏、高频服务)或需要轻量级 DI 容器的场景。

4、创建Prism工程

文件>新建项目

5、工程目录结构

  • Prism 完整应用程序 - 此项目模板创建一个 Prism 应用程序,其中包含一个 Shell 项目、一个模块项目、一个核心项目、一个服务项目和一个单元测试项目。

6、核心对象介绍

      BindableBase  数据与行为绑定对象

简介

BindableBase 是 Prism 中实现 数据绑定通知 的核心基类,继承自 INotifyPropertyChanged 接口。它简化了属性变更通知的触发逻辑,确保 UI 能够自动响应数据变化。

作用与特性
自动触发通知:通过 SetProperty 方法设置属性值,自动触发 PropertyChanged 事件。
减少样板代码:避免手动编写 if (value != field) { ... } 和事件触发逻辑。
支持派生类:ViewModel 通常继承 BindableBase,直接使用其功能。
关键方法
SetProperty(ref T field, T value):基础属性设置。
SetProperty(ref T field, T value, Action onChanged):设置属性并执行回调。
RaisePropertyChanged(string propertyName):手动触发指定属性的通知。

   IContainerRegistry IContainerProvider

  • IContainerRegistry:用于注册服务(接口与实现的映射)。
  • IContainerProvider:用于解析(获取)已注册的服务实例。
     public MainViewModel(IContainerProvider containerProvider){var service = containerProvider.Resolve<IMessageService>();}
    

注册方式


# 接口绑定实现类:
containerRegistry.Register<IMessageService, MessageService>();
#直接注册具体类(无需接口):
containerRegistry.Register<MessageService>();#单例(Singleton):全局唯一实例。
containerRegistry.RegisterSingleton<IMessageService, MessageService>();
#瞬态(Transient):每次解析创建新实例。
containerRegistry.Register<IMessageService, MessageService>();#实例注册:直接注入已有实例。
var logger = new FileLogger();
containerRegistry.RegisterInstance<ILogger>(logger);#同一个接口多个实现,注册时加别名containerRegistry.Register<IMessageService, MessageService>("msg");
containerRegistry.Register<IMessageService, EmailMessageService>("emailMsg");

注入方式

#1、构造函数注入  **推荐
private readonly ILogger _logger;
private readonly IEventAggregator _eventAggregator;public MessageService(IEventAggregator eventAggregator, ILogger logger)#2、属性注入[Dependency]
public ILogger Logger { get; set; }

IEventAggregator

在Prism框架中,事件总线(Event Aggregator) 是实现松耦合跨组件通信的核心机制。它通过发布-订阅模式(Pub-Sub)让不同模块、视图或服务之间无需直接引用即可传递消息,尤其适用于模块化架构和MVVM模式。

核心组件 直接依赖注入

# 使用流程# 定义事件 
// 有参事件
public class NoMicDeviceEvent : PubSubEvent<bool> { }
// 无参事件
public class AppExitEvent : PubSubEvent{ }# 发布事件// 发布有参事件
_eventAggregator.GetEvent<NoMicDeviceEvent>().Publish(true);// 发布无参事件
_eventAggregator.GetEvent<AppExitEvent>().Publish();# 订阅事件// 订阅事件(自动强引用,需手动取消订阅)
_eventAggregator.GetEvent<NoMicDeviceEvent>().Subscribe((bo) => HandleNoMicDeviceEvent(bo));// 处理事件的回调方法
private void HandleNoMicDeviceEvent(bool isNoMic)
{//处理逻辑
}# 订阅参数
.Subscribe(Action<TPayload> action,                     // 回调方法ThreadOption.UIThread,                // ThreadOption threadOption 在UI线程执行keepSubscriberReferenceAlive: false,  // 弱引用Predicate<TPayload> filter:           // 过滤数据
#参数#回调方法
#执行具体的业务逻辑(如更新数据库、刷新UI)。#filter
#过滤无关事件(如只处理特定用户或状态的数据)。#keepSubscriberReferenceAlive
#控制订阅者生命周期(View/ViewModel用弱引用,服务层可强引用)。#ThreadOption
#PublisherThread:在发布事件的线程执行(默认)。
#UIThread:在UI线程执行(安全更新界面)。
#BackgroundThread:在线程池后台线程执行(避免阻塞UI)
#解决跨线程问题(UI操作必须在UI线程,耗时操作在后台线程)。# 卸载事件
_eventAggregator.GetEvent<NoMicDeviceEvent>().Unsubscribe((bo) => HandleNoMicDeviceEvent(bo));

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

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

相关文章

React 单一职责原则:优化组件设计与提高可维护性

单一职责原则&#xff08;SRP&#xff09; 在 React 中&#xff0c;组件是构建 UI 的核心单位&#xff0c;而良好的组件设计是保证应用质量和可维护性的关键。单一职责原则是一种设计原则&#xff0c;也适用于 React 组件的开发。它强调每个组件应该只关注一个职责&#xff0c…

css网格布局Grid

一、网格布局适应场景 当涉及到的布局是二维布局&#xff08;元素不止一行或者一列&#xff09;且比较复杂的时候&#xff0c;可以用网格布局&#xff0c;看下面的一个例子&#xff1a; 上图上一个四行三列的网格&#xff0c;布局相对比较复杂。如果你用别的布局方案&#xff…

利用Python生成Xilinx FPGA ROM IP核 .coe初始化文件

以下是一个 Python 脚本&#xff0c;用于生成 Xilinx IP ROM 的.coe 格式初始化文件&#xff0c;假设ROM 深度为 1024&#xff0c;数据位宽为 32bit&#xff0c;使用随机的 32 位无符号数进行初始化&#xff1a; import random# 定义ROM的深度和数据位宽 rom_depth 1024 data…

8.2 段落格式

在word里&#xff0c;段落格式包括首行缩进、行间距、段前、段后等。LaTex同样支持这些功能。 段落间距 全局设置 段落间距用setlength命令来指定。如以下代码 \documentclass{article} \usepackage{ctex} \begin{document}\setlength{\parskip}{11em plus 1em minus 1em}\p…

OpenVLA-OFT

TL;DR 2025 年斯坦福提出的 OpenVLA 工作的续作 OpenVLA-OFT&#xff0c;优化 VLA 能够有效适应新的机器人平台和任务&#xff0c;优化的技术主要有并行解码、动作块处理、连续动作、L1 回归和&#xff08;可选的&#xff09;FiLM 语言调节 Paper name Fine-Tuning Vision-La…

SpringBoot 接口国际化i18n 多语言返回 中英文切换 全球化 语言切换

介绍 Spring Boot通过MessageSource接口来实现国际化&#xff0c;它可以加载不同的消息资源文件&#xff0c;通常是.properties格式。通过定义不同的语言文件&#xff08;例如&#xff1a;messages_en.properties、messages_zh.properties等&#xff09;&#xff0c;可以根据用…

一个crackme例子

文件下载地址&#xff1a;https://download.csdn.net/download/m0_37567738/90713354 将cipher.txt文件内容解密后&#xff1a; 恭喜你解出了这一关&#xff0c;flag为 zjwa{36_23121136a28d0d15} 好了现在告诉你最后一层的获取方式&#xff0c; 在系统内找到 手机镜像的 ra…

账户解封无望?3步高效申诉取回亚马逊冻结资金

近年来&#xff0c;随着全球跨境电商市场的飞速扩张&#xff0c;亚马逊&#xff08;Amazon&#xff09;作为其中的巨头&#xff0c;持续强化其平台治理力度。然而&#xff0c;随之而来的是卖家账户因各种原因被冻结、关闭的事件频频发生。根据Marketplace Pulse发布的2024年第一…

【C++ Qt】快速上手 显⽰类控件(Label、LCDNumber、ProcessBar、CalendarWidget)

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” 绪论​&#xff1a; 本文围绕Qt中常用的显示类控件展开&#xff0c;重点讲解了 QLabel&#xff08;文本/图片显示&#xff09;、QLCDNumber&#xff08;数字显示&#xff0…

从困局到破局的AI+数据分析

从困局到破局的AI数据分析 困局&#xff1a;数据分析的四道高墙破局&#xff1a;AI赋能全流程数据分析远见&#xff1a;AI数据分析的革命性意义 数据是新时代的石油&#xff0c;人工智能是炼油厂。当两者强强联合&#xff0c;一场数据分析的革命正悄然发生。 多少次你面对Excel…

IGH 汇川SV660N调试

EoE 目前的方式是将eoe 关闭, 这需要重新配置编译ec_master sudo ./configure --disable-8139too --enable-generic --enable-r8169 --disable-eoe --enable-coe[426163.348589] EtherCAT 0: Master thread exited. [426163.348592] EtherCAT 0: Stopping EoE thread. [426163.…

Java基础361问第16问——枚举为什么导致空指针?

我们看一段代码 public enum Color {RED, BLUE, YELLOW;public static Color parse(String color) {return null;} }public static void main() {Color color Color.parse("");// 极具迷惑性&#xff0c;大家日常开发肯定这么写过switch (color) {case RED:break;c…

10.Excel:快速定位目标值

一 批量删除 1.如何使用 快捷键 CTRLG 补充&#xff1a;直接选择定位条件。 2.作用 1.批量删除工作表中的图片 补充&#xff1a;无法通过框选的方式选中这些图片进行删除。 这样只框选了表格&#xff0c;无法框选图片。因为图片在excel中被认为是一个对象&#xff0c;对象无法通…

快乐数(双指针解法)

题目链接202. 快乐数 - 力扣&#xff08;LeetCode&#xff09; 题目拆解 1 取一个正整数每一位的平方和为&#xff0c;如果为1那么直接可以判定为快乐数&#xff0c;如果不为1&#xff0c;就重复这个过程&#xff0c;直到出现1 2 实际上&#xff0c;这道题只有两种情况&#xf…

进程控制的学习

进程控制&#xff08;Process Control&#xff09;是指操作系统对进程的创建、执行、暂停、恢复、终止等一系列状态变化进行管理和协调的过程。 简单说&#xff0c;就是系统让各个程序能有序地运行&#xff0c;合理地使用CPU和资源&#xff0c;而不会互相冲突或者出错。 主要包…

818协议知识笔记

一、概念 Fibre CHannel-Audio Vedio standard;FC-AV FC-FS:Fibre channel framing and signaling interface; FC-PI:fibre channel physical interfaces 二、术语 VGA,SVGA,XGA,WXGA,SXGA,SXGA,WSXGA,UXGA,1440P; ICD:interface control document接口控制文档 CRC对帧头和数据…

AI大模型学习十二:‌尝鲜ubuntu 25.04 桌面版私有化sealos cloud + devbox+minio对象存储测试和漫长修改之路

一、说明 前面已经安装完成&#xff0c;这里我们测试对象存储 AI大模型学习十一&#xff1a;‌尝鲜ubuntu 25.04 桌面版私有化sealos cloud devboxminio&#xff0c;实战运行成功-CSDN博客https://blog.csdn.net/jiangkp/article/details/147424823?spm1011.2415.3001.5331 二…

SpringBoot的自动扫描特性-笔记

1.Spring Boot 的自动扫描特性介绍 Spring Boot 的自动扫描&#xff08;Component Scanning&#xff09;是其核心特性之一。通过注解SpringBootApplication 简化了 Bean 的管理&#xff0c;允许框架自动发现并注册带有特定注解的类为 Spring 容器中的 Bean&#xff08;特定注解…

基于nodeJS代码的通过爬虫方式实现tiktok发布视频(2025年4月)

1、将真实的tiktokstudio平台的cookie填到代码里的cookie变量里,修改python代码里的ticket,ts, privateKey,以及videoPath,timing等变量的值,最后运行python脚本即可; 2、运行之前根据import提示安装一些常见依赖,比如node-fetch等; 3、运行时候可能系统需要科学上网…

数据一致性问题剖析与实践(四)——竞态条件竞争导致的一致性问题

一、前言 之前我们讨论了几种场景的一致性问题 冗余数据存储中的一致性问题分布式共识中的一致性问题单机事务中的一致性问题分布式事务中的一致性问题 本文将围绕竞态条件竞争中的一致性问题展开讨论分析。 二、 问题定义 竞态条件&#xff08;Race Condition&#xff09…