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#自定义事件(简单版本)的更多相关文章

  1. JavaScript使用自定义事件实现简单的模块化开发

    WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我 ...

  2. 仿EXCEL插件,智表ZCELL产品V1.6 版本发布,增加自定义事件功能

    详细请移步 智表(ZCELL)官网www.zcell.net 更新说明  这次更新主要应用户要求,主要解决了单元格值变化时事件的支持,并新增了按单元格名操作的相关API,欢迎大家体验使用. 本次版本更 ...

  3. .net 中 C# 简单自定义事件实现

    个人认为事件处理机制是一种很好的机制 特别是可以方便安全的实现窗口间(子窗口对父窗口,子窗口间等)的消息传递.功能调用 下面展现的源自以前论坛上看到的一套方法,可能记得不大准确,所以可能不规范,我的理 ...

  4. Abp 领域事件简单实践 <三> 自定义事件

    熵片用到的  EntityCreatedEventData<TEntity>,继承自EventData. 我们可以自定义事件: public class TestEvent: EventD ...

  5. javascript和jquey的自定义事件小结

    “通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用 ...

  6. JavaScript自定义事件

    很多DOM对象都有原生的事件支持,向div就有click.mouseover等事件,事件机制可以为类的设计带来很大的灵活性,相信.net程序员深有体会.随着web技术发展,使用JavaScript自定 ...

  7. JS自定义事件(Dom3级事件下)

    原文出处:  http://www.w3cfuns.com/notes/11861/e21736a0b15bceca0dc7f76d77c2fb5a.html . 我拿出作者中的一段,感谢作者原创. ...

  8. js自定义事件、DOM/伪DOM自定义事件

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

  9. 转: JS自定义事件的定义和触发(createEvent, dispatchEvent)

    四.伪DOM自定义事件 这里的“伪DOM自定义事件”是自己定义的一个名词,用来区分DOM自定义事件的.例如jQuery库,其是基于包装器(一个包含DOM元素的中间层)扩展事件的,既与DOM相关,又不直 ...

  10. 漫谈js自定义事件、DOM/伪DOM自定义事件

    一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...

随机推荐

  1. LeetCode刷题感想之DFS

    在剑指Offer里专门有一个部分(大概是连续十几题的样子)考察了 DFS ,也就是深度优先遍历,感觉DFS 也是一种套路,只要思路找对,套一下思路也可以了,在这里记录一下. 在很多Leetcode 的 ...

  2. python学习笔记5--正则表达式

    正则表达式: 语法: import re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0-9]代表匹配0至9的任 ...

  3. js 获取html加载的参数?file=123&time=2021

    <script> function GetArgsFromHref(sHref, sArgName) { var args = sHref.split("?"); va ...

  4. 获取gps

    package com.example.myapplication;import android.Manifest;import android.annotation.SuppressLint;imp ...

  5. 用requests库的get( )函数访问搜狗网站20次

    代码: import requests from bs4 import BeautifulSoup def getHTMLText(url): try: r=requests.get(url,time ...

  6. JavaScript 包装类

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 借助5G智能网关实现无人化智慧农业应用

    发展智慧农业是新时代的必由之路.依托5G+物联网技术赋能农业生产,能够实现更少的人员需求,更大面积的综合土地管理,更实时精细的生产环境监测,更智能的生产自主管控.5G技术正以其广连接.低时延的优势,助 ...

  8. 数据库结构差异比较-SqlServer

    /****** Object: StoredProcedure [dbo].[p_comparestructure_2005] Script Date: 2022/10/8 10:00:20 **** ...

  9. 使用Chloe 连接MySql服务器

    1.需要安装的依赖 Chloe Chloe.MySql MySql.Data(6.9.12) 这个版本对framework没有具体的版本要求 对于 MySql 数据库,需要安装 Install-Pac ...

  10. Unity安卓端文件写在外部设置