C# 实例解析事件委托之EventHandler

概述

     事件属于委托的一个子集,像我们平时界面上的鼠标点击按钮后响应事件、事件的发布和订阅等都需要用到委托.通过委托可以很好的实现类之间的解耦好。事件委托EventHandler的

函数原型如下:delegate 表示这个个委托,事件委托没有返回值,有两个入参,sender是事件触发的对象,e是一个泛型的事件类型参数

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);

用法举例

用法举例1:窗体关闭事件

public void Cancel(object obj, bool e){if (e){sw.AppendLine("try clsoe window");}else{sw.AppendLine("clsoe window is cancel");}}
//事件委托1,事件是委托的子集EventHandler<bool> windowTryClose = Cancel;windowTryClose(this, false);

这里在定义了一个委托EventHandler<bool>,将方法Cancel委托给他,然后嗲用委托执行。

注意:EventHandler<bool> windowTryClose = Cancel;是
EventHandler<bool> windowTryClose = new EventHandler<bool>(Cancel);的简写

传入的参数是false,所以运行结果:

clsoe window is cancel

用法举例2 :按钮点击事件

//事件委托2Button button = new Button();button.ClickEvent += Button_Click;button.ClickAction();
public void Button_Click(Object sender, EventArgs args){sw.AppendLine("这是按钮点击事件");}
public class Button{public EventHandler ClickEvent;public void ClickAction(){ClickEvent.Invoke(this, new EventArgs());}}

这里主要是写了按钮点击事件的一个委托,一般在定义事件委托时前面可以用event去修饰,我这里省略了,

用法举例3 :事件发布与订阅

//事件委托3var myPublishEventArgs = new PublishEvent();_ = new SubscribeEvent(myPublishEventArgs);myPublishEventArgs.Publish();
public class MyPublishEventArgs : EventArgs{public string InfoString { get; set; }}public class PublishEvent{public event EventHandler<MyPublishEventArgs> OnPublish;public void Publish(){OnPublish?.Invoke(this, new MyPublishEventArgs() { InfoString = "hello" });}}public class SubscribeEvent{public SubscribeEvent(PublishEvent publishEvent){publishEvent.OnPublish += Subscribe;}public void Subscribe(Object sender, MyPublishEventArgs args){MessageBox.Show($"我接收到的消息是:{args.InfoString}");}}

这里封装了几个类,MyPublishEventArgs是我要发送的事件,MyPublishEventArgs这个类是发布者,SubscribeEvent这个是订阅者,主要订阅事件一定要放在发布前,这样才能成功接收到事件.

委托部分这里就讲解完事了,全部源码如下:

using PropertyChanged;
using System;
using System.Text;
using System.Threading;
using System.Windows;namespace Caliburn.Micro.Hello.ViewModels
{[AddINotifyPropertyChangedInterface]public class DelegateViewModel : Screen,IViewModel{public string ResultString { get; set; }delegate int DelegateM(string a, string b);//声明,可以有返回值也可以没有StringBuilder sw = new StringBuilder();public DelegateViewModel(){DisplayName = "DelegateTest";}public void Test(){sw.AppendLine($"【Delegate测试】执行线程id:{Thread.CurrentThread.ManagedThreadId}");//func用法1//Func<string, string, int> func = new Func<string, string, int>(p.StringAddA);Func<string, string, int> func = StringAddA;//简写var result = func.Invoke("3", "5");//可以简化为func("3", "5")sw.AppendLine($"【func用法1】func返回结果是:{result}");//func用法2,用lamda表达式简化写法,通过+=注册实现多播委托func += (a, b) =>{return int.Parse(a) - int.Parse(b);};sw.AppendLine($"【func用法2】func返回结果是:{func("3", "5")}");//Action用法//Action<string, string> action = new Action<string, string>(p.StringAddB);Action<string, string> action = StringAddB;//简写IAsyncResult asyncResult = action.BeginInvoke("3", "5", null, null);//action("3", "5"),BeginInvoke异步执行,即:开启新现成处理StringAddBaction.EndInvoke(asyncResult);//阻塞委托,直到执行完成if (asyncResult.IsCompleted){sw.AppendLine($"【Action用法】当前异步委托线程已执行完成");}Test(func, action);//将方法委托后转化为参数进行传递//delegate用法//DelegateM delegateM = new DelegateM(p.StringAddA);DelegateM delegateM = StringAddA;//简写sw.AppendLine($"【delegate用法】delegate返回结果是:{delegateM("3", "5")}");//事件委托1,事件是委托的子集EventHandler<bool> windowTryClose = new EventHandler<bool>(Cancel);windowTryClose(this, false);//事件委托2Button button = new Button();button.ClickEvent += Button_Click;button.ClickAction();//事件委托3var myPublishEventArgs = new PublishEvent();_ = new SubscribeEvent(myPublishEventArgs);myPublishEventArgs.Publish();ResultString = sw.ToString();}public int StringAddA(string a, string b){return int.Parse(a) + int.Parse(b);}public void StringAddB(string a, string b){sw.AppendLine($"【Action用法】Action执行线程id:{Thread.CurrentThread.ManagedThreadId}");sw.AppendLine($"【Action用法】Action执行结果:{(int.Parse(a) + int.Parse(b))}");}public void Test(Func<string, string, int> f, Action<string, string> a){a.Invoke(f.Invoke("3", "5").ToString(), "5");}public void Cancel(object obj, bool e){if (e){sw.AppendLine("try clsoe window");}else{sw.AppendLine("clsoe window is cancel");}}public void Button_Click(Object sender, EventArgs args){sw.AppendLine("这是按钮点击事件");}public void MyEvent(Object sender, EventArgs args){sw.AppendLine("这是按钮点击事件");}}public class Button{public EventHandler ClickEvent;public void ClickAction(){ClickEvent.Invoke(this, new EventArgs());}}public class MyPublishEventArgs : EventArgs{public string InfoString { get; set; }}public class PublishEvent{public event EventHandler<MyPublishEventArgs> OnPublish;public void Publish(){OnPublish?.Invoke(this, new MyPublishEventArgs() { InfoString = "hello" });}}public class SubscribeEvent{public SubscribeEvent(PublishEvent publishEvent){publishEvent.OnPublish += Subscribe;}public void Subscribe(Object sender, MyPublishEventArgs args){MessageBox.Show($"我接收到的消息是:{args.InfoString}");}}
}

运行结果:

393f7aaf9783330e2f7c5b093f8e832e.png

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

wpf中EventHandler的使用

应用情景&#xff1a;比如点击A界面的a按钮&#xff0c;跳转到B界面了&#xff0c;点击b按钮后&#xff0c;触发了业务逻辑&#xff0c;然后需要回到A界面中执行某一个方法。不是唯一的方法&#xff0c;可以使用别的方法&#xff0c;类似观察者模式&#xff0c;有变化了&#x…

使用Transformer模型进行计算机视觉任务的端对端对象检测

Transformer模型是google团队在2017在论文attention is all you need中提出的一个用于NLP领域的模型,但是随着VIT模型与Swin Transformer模型的发布,把Transformer模型成功应用到计算机视觉任务中。 上期图文,我们使用hugging face的transformers模型进行了VIT模型的对象分…

3、线程通信EventHandler使用

作者&#xff1a;韩茹 公司&#xff1a;程序咖&#xff08;北京&#xff09;科技有限公司 鸿蒙巴士专栏作家 一、使用场景 EventHandler开发场景 EventHandler的主要功能是将InnerEvent事件或者Runnable任务投递到其他的线程进行处理&#xff0c;其使用的场景包括&#xff1a…

ChatGPT市场营销指南震撼出炉,你错过了?!

ChatGPT是一种基于AI技术的语言模型&#xff0c;它可以与用户进行对话和交互。它被广泛应用于各个领域&#xff0c;包括市场营销。作为一名市场营销人员&#xff0c;您可以使用ChatGPT来获得创意、解决问题和生成内容。 下面是190个ChatGPT提示&#xff0c;可帮助营销人员更好…

专业分析┃微电子专业介绍及发展前瞻

不知道提到微电子&#xff0c;你最先想到的是什么&#xff1f;芯片&#xff1f;卡脖子&#xff1f;摩尔定律&#xff1f; 因为近两年芯片被限制的原因&#xff0c;大家经常可以从各路媒体上看到“芯片”一词。微电子作为一个学科&#xff0c;简单的说&#xff0c;就是研究如何…

Cookie和session工作流程详解

目录 cookie机制 session会话 理解会话机制 Servlet中对Cookie和Session提供的 HttpServletrequest类中的方法&#xff1a; 模拟实现登录功能 首先实现功能分为两个界面&#xff1a; &#xff08;1&#xff09;登录页面代码&#xff08;前端代码&#xff09; (2) 编写Lo…

Mac - 鼠标拖尾特效 By CursorEffect2

目录 一.引言 二.安装 CursorEffect2 三.使用 CursorEffect2 四.使用效果 五.内存消耗 六.一键关闭 七.总结 一.引言 在自己搭建的 Hexo 博客上可以定义鼠标点击的特效&#xff0c;如图点击后可以产生彩色的斑点。 于是想着除了浏览 Hexo 博客外&#xff0c;能不能别的也…

MyBatis深入学习总结

MyBatis总结 MyBatis入门操作 简介 原始jdbc操作&#xff08;查询数据&#xff09; 原始jdbc操作&#xff08;插入数据&#xff09; 原始jdbc操作的分析 原始jdbbc开发存在的问题如下&#xff1a; 数据库连接创建、释放频繁造成系统资源的浪费从而影响系统性能sql语句在代…

window11中QQ登录“无法访问个人文件夹”解决方案

window11刚发行不久&#xff0c;安装各种软件或多或少会遇到各种bug&#xff0c;例如安装QQ后&#xff0c;打开时会提醒你“无法访问个人文件夹”而打开QQ失败。 可以通过改变你自己设置的个人文件夹的权限来解决这个问题。 找到文件夹所在位置&#xff0c;右击文件夹&#xf…

QQ登录显示无法访问个人文件夹解决办法

之前QQ登录出错&#xff0c;一直显示无法访问个人文件夹&#xff0c;是否自动修复个人文件权限 直接找到你安装qq的文件路径&#xff0c;右键--》授予访问权限--》删除访问&#xff0c;就可以正常登录了 &#xff01;

如何解决Windows10启动QQ时报错无法访问个人文件夹?

1、首先不要安装其他电脑管家&#xff0c;因为这会使Windows10自带的安全中心出现变化&#xff0c;第一步打开自带安全中心。 2、进入之后找到病毒和威胁防护&#xff0c;进入病毒和威胁防护设置。 3、进入病毒和威胁防护设置后&#xff0c;找到管理受控制文件夹访问权限。 4、…

启动QQ时无法访问个人文件夹XXX,是否自动修复个人文件夹权限

如图 点击确定显示修复权限失败 找到上图显示的文件路径 右键属性 -> 安全 -> 编辑 -> 选中Users -> 勾选完全控制

腾讯QQ登录“无法访问个人文件夹”解决方法

今天&#xff0c;登录QQ时出现“无法访问个人文件夹&#xff0c;个人文件将被保存到我的文档”的问题 上网搜索了一下&#xff0c;还是没有解决问题。然后自己思考了一下&#xff0c;可能与我修改了“我的文档”的路径有关&#xff0c;我刚刚安装的QQ个人文件夹也正好指定放在…

解决QQ显示“无法访问个人文件夹”方法

在qq登录的过程中&#xff0c;显示“无法访问个人文件夹”这样的提示&#xff0c;该怎解决&#xff1f; 尝试过把qq卸载之后重新装&#xff0c;改变一下qq的属性-兼容性&#xff0c;以及管理员的方式运行&#xff0c;查了不少的攻略&#xff0c;始终无法解决&#xff1b; 经过…

Win11 “qq无法访问个人文件夹”解决方法(原创)

今天登QQ&#xff0c;突然弹窗显示“qq无法访问个人文件夹”&#xff0c;网上搜了一堆方法都没用&#xff0c;也不想卸载重装qq&#xff0c;我就寻思是不是文件夹权限的问题。 右键显示的无法访问的个人文件夹&#xff0c;选择“安全”&#xff0c;我把Users的权限选中&#xf…

qq 微信 无法访问个人文件夹

昨天某个时刻开始&#xff0c;QQ会出现所有图片无法加载的状况&#xff0c;微信会出现截图发到聊天框是文件的问题。 一开始不以为然&#xff0c;直到第二天重启电脑发现两个软件都登陆不上去了。对应显示的是标题的关键字&#xff0c;因为问题已经解决就不截图了。 解决方案&…

android 新建桌面文件夹在哪里,添加并管理桌面文件夹

添加并管理桌面文件夹 我们在使用Android手机的时候&#xff0c;随着手机内安装的软件越来越多&#xff0c;比如说笔者的这个手机里&#xff0c;算了一下&#xff0c;一共装了110个应用程序&#xff0c;七个分页&#xff0c;每页显示16个图标。那么在这里我们设想一下&#xff…

Win11QQ无法访问个人文件夹

Win11QQ无法访问个人文件夹 #第一步 找到QQ文件存储的文件夹 #第二步 右键→属性→安全→User→编辑→User→完全控制→确定 #OK了 去试一试吧b(&#xffe3;▽&#xffe3;)d

C盘瘦身:QQ文件的清理及Group2文件夹

目录 问题解决方法 Windows 10 20H2 TIM 问题 最近C盘被撑爆了 使用SpaceSniffer一扫发现QQ的文件中有个Group2文件夹占了我17G 但使用QQ自带的个人文件夹清理却扫不到&#xff0c;据说直接删除会丢失近期所有群聊的聊天图片 解决方法 在这个地方找到了大神fsz1987给出的…

QQ个人文件夹保存位置无效

必须写文章谴责QQ这种垃圾软件 B 了 dog&#xff0c;腾讯家的QQ真没几个好用的。之前是PC版QQ群文件跳转回来显示错误bug&#xff0c;之后是手机QQ看点等各种消息bug&#xff0c;现在隔了几年了还有“个人文件夹保存位置无效”。根本没有改进&#xff01; QQ个人文件夹保存位…