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://www.mzph.cn/news/280863.shtml

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

相关文章

多亏了Google相册,如何一键释放Android手机上的空间

Let’s be real here: modern smartphones have limited storage. While they’re coming with a lot more than they used to, it’s easy to fill 32GB without even realizing it. And with today’s high-end cameras, well, pictures and videos can quickly consume a bi…

WPF效果第二百零四篇之自定义更新控件

好久没有更新文章,今天抽空来分享一下最近玩耍的自定义控件;里面包含了自定义控件、依赖属性和路由事件;来看看最终实现的效果:1、先来看看前台Xaml布局和绑定:<Style TargetType"{x:Type Cores:UploadWithProgressControl}"><Setter Property"Templat…

u3d 逐个点运动,路径运动。 U3d one by one, path motion.

u3d 逐个点运动&#xff0c;路径运动。 U3d one by one, path motion. 作者&#xff1a;韩梦飞沙 Author&#xff1a;han_meng_fei_sha 邮箱&#xff1a;313134555qq.com E-mail: 313134555 qq.com 逐个点运动&#xff0c;路径运动。 Im going to do some motion and path. 如果…

小米净水器底部漏水_漏水传感器:您可能没有的最容易被忽视的智能家居设备...

小米净水器底部漏水While most smarthome products are aimed at convenience, there’s one smarthome device that’s actually quite useful, possibly saving you headaches and ton of money: the trusty water leak sensor. 虽然大多数智能家居产品都旨在提供便利&#x…

Unity3D笔记十 游戏元素

一、地形 1.1 树元素 1.2 草元素 二、光源 2.1 点光源 点光源&#xff08;Point Light&#xff09;&#xff1a;好像包围在一个类似球形的物体中&#xff0c;读者可将球形理解为点光源的照射范围&#xff0c;就像家里的灯泡可以照亮整个屋子一样。创建点光源的方式为在Hierarch…

facebook 文本分类_如何禁用和自定义Facebook的通知,文本和电子邮件

facebook 文本分类Facebook is really keen on keeping you on their platform. One of the ways they do that is by sending you notifications whenever the tiniest thing happens. And you won’t just see them on the site—Facebook will also notify you by email, wi…

django06: ORM示例2--uer 与file

存放路径&#xff1a;https://git.lug.ustc.edu.cn/ 笔记 外键与多键 path models.ForeignKey(to"Path")file models.ManyToManyField(to"File") code 处理方式 new_path request.POST.get("new_path",None)models.File.objects.create(…

四种简单的排序算法

四种简单的排序算法 我觉得如果想成为一名优秀的开发者&#xff0c;不仅要积极学习时下流行的新技术&#xff0c;比如WCF、Asp.Net MVC、AJAX等&#xff0c;熟练应用一些已经比较成熟的技术&#xff0c;比如Asp.Net、WinForm。还应该有着牢固的计算机基础知识&#xff0c;比如数…

Xampp修改默认端口号

为什么80%的码农都做不了架构师&#xff1f;>>> Xampp默认的端口使用如下&#xff1a; Httpd使用80端口 Httpd_ssl使用443端口 Mysql使用3306端口 ftp使用21端口 但是&#xff0c;在如上端口被占用的情况下&#xff0c;我们可以通过修改xampp默认端口的方法&…

为什么csrss进程有三个_什么是客户端服务器运行时进程(csrss.exe),为什么在我的PC上运行它?...

为什么csrss进程有三个If you have a Windows PC, open your Task Manager and you’ll definitely see one or more Client Server Runtime Process (csrss.exe) processes running on your PC. This process is an essential part of Windows. 如果您使用的是Windows PC&…

使用c#的 async/await编写 长时间运行的基于代码的工作流的 持久任务框架

持久任务框架 &#xff08;DTF&#xff09; 是基于async/await 工作流执行框架。工作流的解决方案很多&#xff0c;包括Windows Workflow Foundation&#xff0c;BizTalk&#xff0c;Logic Apps, Workflow-Core 和 Elsa-Core。最近我在Dapr 的仓库里跟踪工作流构建块的进展时&a…

多目标跟踪(MOT)论文随笔-SIMPLE ONLINE AND REALTIME TRACKING (SORT)

转载请标明链接&#xff1a;http://www.cnblogs.com/yanwei-li/p/8643336.html 网上已有很多关于MOT的文章&#xff0c;此系列仅为个人阅读随笔&#xff0c;便于初学者的共同成长。若希望详细了解&#xff0c;建议阅读原文。 本文是使用 tracking by detection 方法进行多目标…

明日大盘走势分析

如上周所述&#xff0c;大盘在4与9号双线压力下&#xff0c;上攻乏力。今天小幅下跌0.11%&#xff0c;涨511&#xff0c;平76&#xff0c;跌362&#xff0c;说明个股还是比较活跃&#xff0c;而且大盘上涨趋势未加改变&#xff0c;只是目前攻坚&#xff0c;有点缺乏外部的助力。…

android EventBus 3.0 混淆配置

2019独角兽企业重金招聘Python工程师标准>>> https://github.com/greenrobot/EventBus 使用的这个库在github的官网README中没有写明相应混淆的配置. 经过对官网的查询&#xff0c;在一个小角落还是被我找到了。 -keepattributes *Annotation* -keepclassmembers …

dotnet-exec 0.11.0 released

dotnet-exec 0.11.0 releasedIntrodotnet-exec 是一个 C# 程序的小工具&#xff0c;可以用来运行一些简单的 C# 程序而无需创建项目文件&#xff0c;让 C# 像 python/nodejs 一样简单&#xff0c;而且可以自定义项目的入口方法&#xff0c;支持但不限于 Main 方法。Install/Upd…

运行时获取类库信息

运行时获取类库信息Intro在我们向别的开源项目提 issue 的时候&#xff0c;可能经常会遇到别人会让我们提供使用的版本信息&#xff0c;如果别的开源项目类库集成了 source link&#xff0c;我们可以从程序集信息中获取到版本以及对应的 commit 信息&#xff0c;这样我们就可以…

xbox360链接pc_如何将实时电视从Xbox One流式传输到Windows PC,iPhone或Android Phone

xbox360链接pcSet up your Xbox One’s TV integration and you can do more than just watch TV on your Xbox: you can also stream that live TV from your Xbox to a Windows 10 PC, Windows phone, iPhone, iPad, or Android device over your home network. 设置Xbox One…

WPF ABP框架更新日志(最新2022-11月份)

更新说明本次更新内容包含了WPF客户端以及Xamarin.Forms移动端项目, 更新内容总结如下:WPF 客户端修复启动屏幕无法跳转异常修复添加好友异常修复托盘图标状态更新异常优化好友发送消息时状态检测更新聊天窗口UI风格更新好友列表得头像显示更新聊天窗口消息日期分组显示更新系统…

JSONObject和JSONArray 以及Mybatis传入Map类型参数

import org.json.JSONArray;import org.json.JSONObject;将字符串转化为JSONArray JSONArray jsonArray new JSONArray(deviceInfo); //注意字符串的格式将JSONArray转化为JSONObject类型 JSONObject jsonObject jsonArray.getJSONObject(0);将值存入Map Map<String,S…

十月cms_微软十月更新失败使整个PC行业陷入困境

十月cmsMicrosoft still hasn’t re-released Windows 10’s October 2018 Update. Now, PC manufacturers are shipping PCs with unsupported software, and Battlefield V is coming out next week with real-time ray-tracing technology that won’t work on NVIDIA’s RT…