wpf 自定义 一个事件聚合自定义示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace WpfLibraryEventAggregator
{public class EventAggregator{/// <summary>/// 定义数据暂存/// </summary>private readonly Dictionary<Type, List<Delegate>> _handlers = new Dictionary<Type, List<Delegate>>();// 订阅事件, 订阅后后续被触发事件  /// <summary>/// d订阅事件 泛型方法/// </summary>/// <typeparam name="TEvent"></typeparam>/// <param name="handler"></param>public void Subscribe<T>(Action<T> handler){Type eventType = typeof(T); if (!_handlers.ContainsKey(eventType)){_handlers[eventType] = new List<Delegate>();}_handlers[eventType].Add(handler);}// 取消订阅事件  /// <summary>/// 取消订阅事件 /// </summary>/// <typeparam name="TEvent"></typeparam>/// <param name="handler"></param>public void Unsubscribe<T>(Action<T> handler){Type eventType = typeof(T);if (_handlers.ContainsKey(eventType)){_handlers[eventType].Remove(handler);// 如果该事件类型没有订阅者了,可以移除它(可选)  if (!_handlers[eventType].Any()){_handlers.Remove(eventType);}}}/// <summary>///   // 发布事件 /// </summary>/// <typeparam name="T"></typeparam>/// <param name="eventToPublish"></param>public void Publish<T>(T eventToPublish){Type eventType = typeof(T);if (_handlers.ContainsKey(eventType)){foreach (var handler in _handlers[eventType].ToList()) // 使用 ToList 以避免在迭代时修改集合  {((Action<T>)handler)(eventToPublish);}}}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using WpfLibraryEventAggregator;namespace WpfApp1.eventAggregator
{/// <summary>/// 自定义定义事件类/// </summary>public class MessageEvent //: EventArgs{public string Message { get; }public MessageEvent(string message){Message = message;}}}
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using WpfApp1.eventAggregator;
using WpfLibraryEventAggregator;namespace WpfApp1
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{private readonly EventAggregator _eventAggregator = new EventAggregator();public MainWindow(){InitializeComponent();// 订阅事件  _eventAggregator.Subscribe<MessageEvent>(OnMessageReceived);}/// <summary>/// 可以在别的页面调用来触发该事件相应/// </summary>/// <param name="e"></param>private void OnMessageReceived(MessageEvent e){// 处理事件,例如更新 UI  MessageBox.Show(e.Message);}private void btnevent_Click(object sender, RoutedEventArgs e){// 假设在某个地方发布事件   ,发布会触发本页面_eventAggregator.Publish(new MessageEvent("Hello, WPF!"));}// 确保在窗口关闭时取消订阅(可选)  protected override void OnClosed(EventArgs e){// 注意:在这个简单的例子中,我们并没有真正的取消订阅逻辑,  // 因为 MainWindow 的实例将在应用程序结束时被销毁。  // 在更复杂的应用程序中,你可能需要跟踪所有订阅并显式取消它们。  _eventAggregator.Unsubscribe<MessageEvent>(OnMessageReceived);// 避免事件挤压base.OnClosed(e);}}
}

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

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

相关文章

Linux--深入理与解linux文件系统与日志文件分析

目录 一、文件与存储系统的 inode 与 block 1.1 硬盘存储 1.2 文件存取--block 1.3 文件存取--inode 1.4 文件名与 inode 号 ​编辑 1.5 查看 inode 号码方法 1.6 Linux 系统文件的三个主要的时间属性 1.7 硬盘分区结构 1.8 访问文件的简单了流程 1.9 inode 占用 1.…

【前端从入门到精通:第八课:CSS浮动布局实战】

EWSHOP布局实战 目录结构 /ewshop/ |- index.html 首页 |- css/ CSS目录 |- global.css 全局样式 |- index.css index.html文件样式 |- img/ 图像资源目录 |- font/字体图标目录 global.css 主要作用&#xff1a;设置全局样式&#xff0c;清空默认样式 base.css,设置常用的基础…

适配各种IT场景的零信任沙箱

在当今数字化时代&#xff0c;网络安全威胁层出不穷&#xff0c;传统的安全防御策略已难以应对日益复杂的网络攻击。零信任与沙箱技术的结合&#xff0c;作为一种新兴的安全防护策略&#xff0c;正逐渐受到企业和组织的青睐。本文将深入探讨零信任结合沙箱技术所能解决的问题及…

odoo视图继承

odoo视图继承 在模型时候&#xff0c;不对视图、菜单等进行修改&#xff0c;原视图和菜单等视图数据仍然可以使用&#xff0c;不需要重新构建 form视图继承案例 model&#xff1a;为对应模型 inherit_id&#xff1a;为继承的视图&#xff0c;ref:为继承视图的id&#xff0…

高考完的假期想学c语言要注意那些问题?

c语言算是现代编程语言里面比较简单的一个&#xff0c;对于高考刚考完的学生来说确实很适合刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全…

1.mysql基本概念环境配置等

1、数据库 mysqlmysqld数据库服务端 以特定格式保存的文件&#xff0c;我们叫做数据库广义&#xff1a;提供较为便捷的数据的存取服务 的软件集合、解决方案 ——mysql数据库 数据库VS文件 文件或者数据库&#xff0c;都可以进行数据的存储。 如果用文件&#xff0c;数据内容…

ChatGPT提问获取高质量答案的艺术PDF下载书籍推荐分享

ChatGPT高质量prompt技巧分享pdf&#xff0c; ChatGPT提问获取高质量答案的艺术pdf。本书是一本全面的指南&#xff0c;介绍了各种 Prompt 技术的理解和利用&#xff0c;用于从 ChatGPTmiki sharing中生成高质量的答案。我们将探讨如何使用不同的 Prompt 工程技术来实现不同的目…

类与对象-继承-构造和析构顺序

构造和析构顺序 #include<iostream> using namespace std;class Base { public:Base(){cout << "Base构造函数" << endl;}~Base(){cout << "Base析构函数" << endl;} };class Son :public Base { public:Son(){cout <&l…

移动UI:发现页面,是什么,有啥作用,该如何设计呢?

移动应用中的“发现页面”通常用于向用户展示新的内容、功能、活动或推荐信息&#xff0c;以帮助用户发现和探索应用中的新内容或功能。设计一个好的发现页面可以提升用户对应用的兴趣和粘性。 以下是设计发现页面时可以考虑的一些要点&#xff1a; 1. 推荐内容&#xff1a; …

驻场运维的前途在哪里,这里有金玉良言

甲方和乙方都干过&#xff0c;技术和经理都当过&#xff0c;我把重点跟你标记出来了。 你的思想要认识到&#xff0c;驻场运维不是纯技术&#xff0c;不是依靠你的技术进行单纯维护工作。是配合服务经理&#xff0c;做好服务工作&#xff0c;让乙方服务经理更好的开展工作&…

Elasticsearch7.10集群搭建

Elasticsearch详细介绍&#xff1a; Elasticsearch 是一个分布式、RESTful 风格的搜索和分析引擎。它的核心基于 Apache Lucene&#xff0c;能够处理海量的数据&#xff0c;并支持实时的全文搜索。以下是关于 Elasticsearch 的详细介绍。 一、基本概念 索引&#xff08;Index…

Git的稀疏检出(sparse checkout)

使用git bash 创建项目目录 mkdir projectDir 进入目录 cd projectDir 初始化空仓库 git init 关联远程地址 git remote add -f origin http://xxx.git 开启Sparse Checkout模式 git config core.sparsecheckout true 设置Check Out的文件或目录 echo "dir1/&…

Conformal low power-1.概述

概述 设计师们越来越期望更长的电池寿命和更高的性能。由于漏电流的增加&#xff0c;使用90纳米及更小工艺节点制造的设备在不使用时的功耗与使用时相同。设计师们可以针对漏电流和动态功耗进行优化&#xff0c;这可以减少能源使用并降低冷却和封装成本。额外的高级低功耗方法…

视觉语言模型:融合视觉与语言的未来

1. 概述 视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;是能够同时处理和理解视觉&#xff08;图像&#xff09;和语言&#xff08;文本&#xff09;两种模态信息的人工智能模型。这种模型结合了计算机视觉和自然语言处理的技术&#xff0c;使得它们能够在…

基于SAM的零样本相似性评价方法

文章目录 介绍方法SAM编码器相似性指标代码复现介绍 图像转换具有广泛的应用,如风格转换和模态转换,通常是生成具有高度真实和忠实的图像。这些问题仍然很困难,特别是在保存语义结构很重要的时候。传统的图像级相似性度量的用途有限,因为图像的语义是高级的,并且不受对原…

简单分享下利用python做测试的学习方向

做为一名转行过来的工程师&#xff0c;我想分享一下这些年来&#xff0c;我对于技术是怎样晋升的&#xff0c;我是在职&#xff0c;边上班边利用时间学习起来的&#xff0c;也听过很多业内人的分享&#xff08;简单可以总结以下几点&#xff0c;分享给大家碎片的式学习方式&…

ESP32网络开发:1.创建一个基于TCP网络协议的网站

一、TCP协议的介绍 TCP&#xff08;传输控制协议&#xff0c;Transmission Control Protocol&#xff09;是互联网协议套件中的一种核心协议&#xff0c;主要用于在网络中的计算机之间可靠地传输数据。TCP协议位于OSI模型&#xff08;开放系统互联模型&#xff09;的传输层&…

「7.9更新日志」JVS·智能BI、逻辑引擎(服务编排)功能更新说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了 低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&am…

java使用poi-tl模版引擎导出word之列表循环数据渲染

目录 1.模版制作2.开启spring表达式3.编写关键代码接口4. 导出结果 poi-tl模版引擎中&#xff0c;如果区块对的值是一个非空集合&#xff0c;区块中的文档元素会被迭代渲染一次或者N次&#xff0c;这取决于集合的大小&#xff0c;类似于foreach语法。 1.模版制作 在静态资源目…

MySQL 速记SQL语句(SQL语句学习)

一、DDL DDL是Data Definition Language&#xff08;数据定义语言&#xff09;的缩写&#xff0c;它是SQL语言的一部分&#xff0c;主要用于定义数据库结构。DDL语句被数据库系统用来创建、修改或删除数据库对象&#xff0c;如数据库、表、索引、视图等。 #查询所有数据库 sh…