C#自定义事件(简单版本)
C#中的事件分为两种:一种是厂商微软在VS中已经内置,以供用户使用;另一种是有用户自己定义的事件;
先简单回顾下第一种:
【场景1】一个Form上一个Textbox控件和Button控件,当用户按下Button控件时,textbox显示内容“按钮被按下”,当用户松开按钮时,textbox则显示“按钮松开”;
代码如下:
using System.Windows.Forms; namespace ButtonEventBokeyuan
{
class Program
{
static void Main(string[] args)
{
MyForm1 myForm1 = new MyForm1();
myForm1.FormInitShow();
}
}
public class MyForm1
{
Form form1 = new Form();//定义类的字段-控件1
Button button = new Button();//定义类的字段-控件2
TextBox textBox = new TextBox();//定义类的字段-控件3
public void FormInitShow()
{
button.Text = "Press me";
button.Top = 30;
form1.Controls.Add(button);
form1.Controls.Add(textBox);
button.MouseDown += button_MouseDown;//VS中button自带的事件挂接事件处理器
button.MouseUp += button_MouseUp;//VS中button自带的事件挂接事件处理器
form1.ShowDialog();
}
private void button_MouseUp(object sender, MouseEventArgs e)
{
this.textBox.Text = "按钮被松开";
}
private void button_MouseDown(object sender, MouseEventArgs e)
{
this.textBox.Text = "按钮被按下";
}
}
}
运行效果:

以上回顾了VS自带的事件;
接下来,看看第二种,咱们自己如何定义一个类的事件内,以便让其他人去订阅,即事件的挂接;
【场景2】:现在有3种人,指挥官、士兵、平民,他们全部派生自人这个基类;人这个类都具有Run()这个可重写的方法;
现在指挥官有个事件——咳嗽(暗号),而士兵订阅了这个咳嗽事件,一旦指挥官走出来,然后咳嗽,士兵就会立即发起进攻;同时士兵也有进攻开始这个事件,该事件被平民订阅,一旦士兵发起进攻,平民就会跑;
先看类图:

接下来实现完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace CustomerEvent
{
public delegate void UserRequest();
class Program
{
static void Main(string[] args)
{
Commander commander = new Commander("Jack");
Soldier soldier = new Soldier("Herry");
Civilian civilian = new Civilian("Allen");
commander.KekeEvent += soldier.OnKekeHandler;//指挥官的咳嗽暗号事件订阅
soldier.AttackBegin += civilian.OnAttackingHandler;//士兵的开始攻击事件订阅
commander.Trigger();//指挥动作引起一些列士兵和平民的事件;
Console.ReadLine();
}
}
/// <summary>
/// 基类
/// </summary>
public class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public string Name { get; set; }
public virtual void OnAttackingHandler()
{
Console.WriteLine($"{GetTime.GetTimeNow()}{this.Name}开始跑了。。。");
}
}
/// <summary>
/// 指挥官类,具有咳嗽的事件,暗号
/// </summary>
class Commander : Person
{
public Commander(string name) : base(name)
{
this.Name = name;
}
public event UserRequest KekeEvent;
public void Trigger()
{
this.OnAttackingHandler();
Console.WriteLine($"{GetTime.GetTimeNow()}指挥官{this.Name}咳嗽暗号");//指挥官跑出来发出咳嗽暗号
if (KekeEvent!=null)//事件不为空,则执行
{
KekeEvent();
}
else
{
Console.WriteLine($"{GetTime.GetTimeNow()}commander没触发事件");
}
}
public override void OnAttackingHandler()
{
Thread.Sleep(100);
Console.WriteLine($"{GetTime.GetTimeNow()}指挥官{this.Name}跑出来");
}
}
/// <summary>
/// 士兵类;
/// </summary>
class Soldier : Person
{
public event UserRequest AttackBegin;
public Soldier(string str) : base(str)
{
this.Name = str;
}
internal void OnKekeHandler()
{
Thread.Sleep(100);
Console.WriteLine($"{GetTime.GetTimeNow()}士兵{this.Name}开始攻击...");
if (AttackBegin != null)
{
AttackBegin();
}
else { }
}
public override void OnAttackingHandler()
{
Thread.Sleep(20);
Console.WriteLine($"{GetTime.GetTimeNow()}士兵{this.Name}开始跑了...");
}
}
/// <summary>
/// 平民类
/// </summary>
class Civilian : Person
{
public Civilian(string name) : base(name)
{
this.Name = name;
}
public override void OnAttackingHandler()
{
Thread.Sleep(100);
Console.WriteLine($"{GetTime.GetTimeNow()}平民{this.Name}逃难跑了。。。");
}
}
class GetTime
{
public static string GetTimeNow()
{
return DateTime.Now.ToString("hh:mm:ss.fff")+">>";
}
} }
实现效果:

End.
写在最后,文章中的第二个场景是本人原创Demo,用来更好地理解用户事件的编程技术;重在自己多练习,不然觉得自己懂了,一旦动手,仍然两眼一抹黑!
#未经本人允许,禁止各种形式转载与转发#
谢谢!
C#自定义事件(简单版本)的更多相关文章
- JavaScript使用自定义事件实现简单的模块化开发
WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我 ...
- 仿EXCEL插件,智表ZCELL产品V1.6 版本发布,增加自定义事件功能
详细请移步 智表(ZCELL)官网www.zcell.net 更新说明 这次更新主要应用户要求,主要解决了单元格值变化时事件的支持,并新增了按单元格名操作的相关API,欢迎大家体验使用. 本次版本更 ...
- .net 中 C# 简单自定义事件实现
个人认为事件处理机制是一种很好的机制 特别是可以方便安全的实现窗口间(子窗口对父窗口,子窗口间等)的消息传递.功能调用 下面展现的源自以前论坛上看到的一套方法,可能记得不大准确,所以可能不规范,我的理 ...
- Abp 领域事件简单实践 <三> 自定义事件
熵片用到的 EntityCreatedEventData<TEntity>,继承自EventData. 我们可以自定义事件: public class TestEvent: EventD ...
- javascript和jquey的自定义事件小结
“通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用 ...
- JavaScript自定义事件
很多DOM对象都有原生的事件支持,向div就有click.mouseover等事件,事件机制可以为类的设计带来很大的灵活性,相信.net程序员深有体会.随着web技术发展,使用JavaScript自定 ...
- JS自定义事件(Dom3级事件下)
原文出处: http://www.w3cfuns.com/notes/11861/e21736a0b15bceca0dc7f76d77c2fb5a.html . 我拿出作者中的一段,感谢作者原创. ...
- js自定义事件、DOM/伪DOM自定义事件
一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...
- 转: JS自定义事件的定义和触发(createEvent, dispatchEvent)
四.伪DOM自定义事件 这里的“伪DOM自定义事件”是自己定义的一个名词,用来区分DOM自定义事件的.例如jQuery库,其是基于包装器(一个包含DOM元素的中间层)扩展事件的,既与DOM相关,又不直 ...
- 漫谈js自定义事件、DOM/伪DOM自定义事件
一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...
随机推荐
- Jmeter三、重要组件(元素)介绍
一.组件 1.sampler 2.计时器timer 3.(sampler的)前置处理器pre processors, 后置处理器post processors 4.断言assertion==loadr ...
- 【python】第二模块 步骤一 第二课、数据库表的相关操作
第二课.数据库表的相关操作 一.课程介绍 1.1 课程介绍 学习目标 管理逻辑库和数据表 创建.删除.修改逻辑库和数据表 了解常用的数据类型和约束 字符串.整数.浮点数.精确数字.日期.枚举.主要约束 ...
- spring security添加接口白名单
在项目中遇到的问题是要将某个接口设为白名单,无需验证即可被用户使用. 解决方法: 在nacos配置文件中ignore whites(不校验白名单)中添加对应接口,无gateway前缀即可,添加立即生效 ...
- UCID数据集
UCID数据集,做实验使用, 免费分享. 自取 链接:https://pan.baidu.com/s/1etMgXShdd_tJFHWbP3ipNw 提取码:62ww
- Navicat15激活
1.下载Navicat for MySQL 15 https://www.navicat.com.cn/download/navicat-for-mysql 2.下载激活工具 注意:因某些限制,下载链 ...
- css怪异现象合集
一.margin上塌陷解决方案(无中生有的margin-top): 1.父级元素设置padding-top:1px;//最不靠谱的解决方案 2.父级元素设置 overflow: hidden; 或者 ...
- webpack配置跨域proxy
首先新建一个项目: 安装vue-cli: npm i -g @vue/cli npm i -g @vue/cli-init 安装webpack: npm install webpack -g vue新 ...
- test.sh 监听进程是否存在
监听myloader进程是否结束,结束后把时间输出到 /root/time.log vim test.sh #!/bin/bash #确保PRO查询进程唯一 PRO="myloader&qu ...
- connect及bind、listen、accept背后的三次握手
如图所示打上断点,分别找出connect() bind() listen() accpet()对应的函数 源码在上一次作业中已经分析过了 https://www.cnblogs.com/qwertyu ...
- 记一次FusionCompute安装springboot应用过程
客户给了一个地址,登录后发现是FusionCompute 的一个虚拟机,第一次使用,于是过了一下在线帮助文档 ,大概明白了. 因为客户已经创建完了裸机虚拟机,前面的过程我也不会太多关注. 在概要里,可 ...