概述

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

运行结果:

C# 实例解析事件委托之EventHandler相关推荐

  1. 事件委托 EventHandler 。

    事件就是当对象或类状态发生改变时,对象或类发出的信息或通知.发出信息的对象或类称为"事件源",对事件进行处理的方法称为"接收者",通常事件源在发出状态改变信息时 ...

  2. java eventhandler 触发_事件委托 EventHandler

    事件就是当对象或类状态发生改变时,对象或类发出的信息或通知.发出信息的对象或类称为"事件源",对事件进行处理的方法称为"接收者",通常事件源在发出状态改变信息时 ...

  3. 在C#中使用代理的方式触发事件 (委托和事件 ) (转)

    From:  http://www.cnblogs.com/gzhnan/articles/1859477.html 在C#中使用代理的方式触发事件 (委托和事件 ) 事件(event)是一个非常重要 ...

  4. .net 事件委托 java_仿net事件委托的java事件模型实现(转csdn)

    作为对比,我们来看看Java Swing的事件处理和委托就要复杂很多:代码如下:(您若还不是很了解Swing事件驱动的话,可以参考我的另外一篇文章:事件驱动模型实例详解(Java篇))://为btnS ...

  5. 你真的理解事件绑定、事件冒泡和事件委托吗?

    一文了解Web API中的事件绑定.事件冒泡.事件委托 引言 正文 一.事件绑定 1.事件和事件绑定时什么? 2.事件是如何实现的? 二.事件冒泡 1.事件模型 2.事件模型解析 (1)捕获阶段 (2 ...

  6. MVP 模式实例解析

    MVP 模式实例解析 引言 可能有的朋友已经看过我翻译的Jean-Paul Boodhoo的 模型-视图-提供器 模式 一文了(如果没有,建议你先看下再看这篇文章,毕竟这两篇是紧密联系的).在那篇文章 ...

  7. 观察者设计模式 Vs 事件委托(java)

    观察者设计模式 Vs 事件委托 标签: 设计模式 java 事件的委托 转载请注明原博客地址: http://blog.csdn.net/gdutxiaoxu/article/details/5182 ...

  8. C# EventHandler 委托和EventHandler<TEventArgs> 委托

    EventHandler 委托 定义 命名空间: System 程序集: System.Runtime.dll 表示将用于处理不具有事件数据的事件的方法. C#复制 public delegate v ...

  9. Reactor实例解析

    \ 要点 \\ Reactor是一个运行在Java8之上的响应式流框架,它提供了一组响应式风格的API\\t 除了个别API上的区别,它的原理跟RxJava很相似\\t 它是第四代响应式框架,支持操作 ...

最新文章

  1. Linux 设备树device tree 使用手册
  2. 初探 C# GPU 通用计算技术
  3. yml 后面的配置覆盖前面的
  4. xcode快捷创建控件
  5. 50: 加密与解密 、 AIDE入侵检测系统 、 扫描与抓包 、 总结和答疑
  6. 【转载】VGA视频信号详解
  7. 个人博客网站编写(01)
  8. 批量压缩图片软件 JAVA
  9. 模电数电自动控制原理实验台QY-MS301C
  10. pmp中ram和raci的区别_【PMP考前冲刺】知识点大全(四)
  11. 使用ffmpeg的调色板对图片压缩
  12. 面试被问到如何设计微信钉钉后端高并发IM架构?懵了.....
  13. iphone的ibooks如何导入pdf?
  14. Linux服务器使用php发送邮件,sendmail配置
  15. 使用轻量级JAVA 爬虫Gecco工具抓取新闻DEMO
  16. 蘑菇云【行空板Python入门教程】第四课:模拟星空
  17. STM32F103学习笔记四 时钟系统
  18. centos8关机命令
  19. 12306:候补购票服务扩大到全部列车;G Suite 漏洞:部分密码明文存储
  20. mediawiki-1.34.0安装扩展CirrusSearch

热门文章

  1. 微软语音技术 Windows 语音编程初步
  2. java enum 重写_重写enum的valueof方法等
  3. 好看的html登录遮罩提示加载中,jQuery炫酷页面预加载Loading特效插件
  4. java fullcalendar_fullCalendar 采用Java ajax加载后台日程事件
  5. 电脑问题处理篇6:解决电脑底部任务栏变小如何还原的问题
  6. 开放平台的开发者如何赚钱
  7. 写作的宿命:知其不可知而知欲不泯
  8. SAP UI5 应用开发教程的学习目录 - 循序渐进,由浅入深,适合不同水平的 SAP UI5 开发人员
  9. 【python】批量高速获取 Instagram,一个简单的外国分享网站
  10. 子桓说:中国人清明节一定要祭祖?全面科普“生与死”