我知道你为啥点进来,所以不要犹豫了,立刻马上果断创建控制台项目,直接复制下面精干短小而又强大的代码运行:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestEvent
{
class MyEvent //声明事件
{
public event EventHandler<EventArgs> OnInput; //定义一个委托类型的事件
public void WaitInput()
{
while (true)
{
if (Console.ReadLine() == "x")
OnInput(this, new EventArgs()); //触发事件
}
}
}
class Program
{
static void Main(string[] args)
{
MyEvent Evt = new MyEvent();//实例化
Evt.OnInput += On_Input; //绑定事件到方法
Evt.WaitInput();
}
//事件处理方法
private static void On_Input(object sender, EventArgs e)
{
Console.WriteLine("你触发了‘X’!");
}
}
}

输入'x'回车,看效果:

如果触发事件的时候,想传递点参数怎么办?看来你是一个要求很高的人!请删掉上面的代码,复制下面的进去运行看看:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TestEvent
{
//事件参数定义
class MyEventArgs : EventArgs
{
char _char;
string _msg;
//事件参数重载
public MyEventArgs(char chr)//当输入内容为字符
{
this._char = chr;
}
public MyEventArgs(string msg)//当输入内容为字符串
{
this._msg = msg;
}
//事件属性
public int Ascii//获取输入的(首字符)ASCII码
{
get { return string.IsNullOrEmpty(_msg) ? (int)_char : ; }
}
public char Char//获取输入的(首)字符
{
get { return string.IsNullOrEmpty(_msg) ? _char : '?'; }
}
public string Msg//获取输入的字符串
{
get { return string.IsNullOrEmpty(_msg) ? "Not String!" : _msg; }
}
}
//事件
class MyEvent
{
public event EventHandler<MyEventArgs> OnInput; //定义一个委托类型的事件
public void WaitInput()
{
while (true)
{
string str = Console.ReadLine();
if (str.Length == )
OnInput(this, new MyEventArgs(str[])); //触发事件
else
OnInput(this, new MyEventArgs(str)); //演示不同的参数类型
}
}
}
class Program
{
static void Main(string[] args)
{
MyEvent Evt = new MyEvent();//实例化
Evt.OnInput += On_Input; //绑定事件,也就是触发的方法
Evt.WaitInput();
}
//事件处理方法
private static void On_Input(object sender, MyEventArgs e)
{
Console.WriteLine("输入的内容: " + e.Msg);
Console.WriteLine("输入的字符: " + e.Char + " (ASCII: " + e.Ascii.ToString() + ")");
}
}
}

效果:

然而还有一些道友有着更高更骚的要求,比如使用了很多的类[n],怎么处理事件,怎么判断事件是哪个类触发的?请看下面通过第一个示例修改后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestEvent
{
class MyEvent //声明事件
{
public event EventHandler<EventArgs> OnInput; //定义一个委托类型的事件
public string MyID { get; set; }
public void TestInput( string s)
{
if(s==MyID)//如果输入的和自己的ID一样,就触发事件
OnInput(this, new EventArgs());
}
}
class Program
{
static void Main(string[] args)
{ MyEvent[] Evt = new MyEvent[];//声明
for (int i = ; i < Evt.Length; i++)
{
Evt[i] = new MyEvent();//实例化
Evt[i].MyID = (i + ).ToString();//设置ID1~9
Evt[i].OnInput += On_Input; //都绑定事件到同一个方法
}
while (true)//由于是单线程不能每个都循环,输入监视放到这里来,写成多线程代码增多太绕了
{
string s = Console.ReadLine();
foreach (MyEvent me in Evt)
me.TestInput(s);//分别提交测试
}
}
//事件处理方法
private static void On_Input(object sender, EventArgs e)
{
string _id = (sender as MyEvent).MyID;//注意这里
Console.WriteLine("第 " + _id + " 被触发!");
}
}
}

输入数字后回车看效果:

最后还剩一个特别说明,专门为好奇心特别重的朋友准备,上面的代码中,绑定事件为啥写成+=?因为...

Evt.OnInput += On_Input; //绑定事件
Evt.OnInput -= On_Input; //解绑事件

6-18:再补充一个简单的例子,在事件处理中设置参数,决定是否退出监听输入:

//事件参数定义
class MyEventArgs : EventArgs
{
public MyEventArgs(string s) { InputString = s; }
public string InputString { get; private set; }
public bool Cancel { get; set; }
}
//事件
class MyEvent
{
public event EventHandler<MyEventArgs> OnInput; //定义一个委托类型的事件
public void WaitInput()
{
while (true)//监视输入的循环
{
string str = Console.ReadLine();
if (!string.IsNullOrEmpty(str))
{
MyEventArgs myevent = new MyEventArgs(str);
OnInput(this, myevent); //触发事件
if (myevent.Cancel)
{
Console.WriteLine("退出监听!");
break;
}
}
}
}
}
class Program
{
static void Main(string[] args)
{ MyEvent Evt = new MyEvent(); //实例化
Evt.OnInput += On_Input; //绑定事件
Evt.WaitInput(); //监听输入
Evt.OnInput -= On_Input; //解绑事件
Console.ReadLine();
}
//事件处理方法
private static void On_Input(object sender, MyEventArgs e)
{
if (e.InputString == "x")
e.Cancel = true; //设置取消监听
else
Console.WriteLine("您输入了:" + e.InputString);
}
}

效果:

上面的示例修改自网上,机制、原理啥的我也不复制了,太绕了,反正发一大堆文字也没啥人愿意看,还不如简单粗暴直接代码算了。大家都是这么用,无毒无副作用无不良反应。

C#超简单自定义事件的更多相关文章

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

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

  2. js简单自定义事件与主动触发事件

    var events = { addHandler: function (element, eventType, handler) { if (element.addEventListener) { ...

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

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

  4. .net自定义事件,经典简单实例代码

    1,新建一个控制台应用程序TestDelegate,本项目主要实现:热水器加热,报警器监控,当热水温度达到80度的时候报警器报警这样一个简单的事件处理程序 2,定义委托处理程序 public dele ...

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

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

  6. Javascript之自定义事件

    Javascript自定义事件,其本质就是观察者模式(又称订阅/发布模式),它的好处就是将绑定事件和触发事件相互隔离开,并且可以动态的添加.删除事件. 下面通过实例,一步一步构建一个具体的Javasc ...

  7. 跟着《beginning jquery》学写slider插件并借助自定义事件改进它

    <beginning jquery>是一本很不错的学习jquery的书,作者的讲解深入浅出,很适合初学者,在最后一章里面,作者把前面所有的点结合起来完成了一个轮播图的jquery插件.实现 ...

  8. 把C#程序(含多个Dll)合并成一个Exe的超简单方法

    开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具.那该怎么办呢? 下文介绍一种超 ...

  9. 【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】

    UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...

随机推荐

  1. 【强大精美的PS特效滤镜合集】Alien Skin Eye Candy for Mac 7.2.2.20

    [简介] Alien Skin Eye Candy for Mac 7.2.2 版本,支持最新的PhotoShop CC 2019.2018等版本,这是一款强大酷炫的PS特效滤镜合集,具有32种滤镜和 ...

  2. 使用 gzexe 快速加密解密文件内容

    使用 gzexe 快速加密解密文件内容 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.使用sshpass工具编写远程管理脚本 1>.安装依赖包 [root@node101 ...

  3. InnoDB-MVCC与乐观锁

    最近通过<高性能MySQL>一书学习MySQL方面的知识,在看到书中所讲InnoDB-MVCC部分的时候,有一种强烈的感觉,这不就是乐观锁吗(入门级小学徒的疑惑脸)?当下便去网上以各种方式 ...

  4. [物理学与PDEs]第1章第4节 电磁能量和电磁动量, 能量、动量守恒与转化定律 4.3 电磁能量 (动量) 密度, 电磁能量流 (动量流) 密度

    1. 电磁能量密度: $\cfrac{1}{2}\sex{\ve_0E^2+\cfrac{1}{\mu_0}B^2}$. 2. 电磁能量流密度向量: ${\bf S}=\cfrac{1}{\mu_0} ...

  5. windows 下 bat 计划任务删除保留时间内文件

    date  windows 打印时间戳  年:echo %date:~,% 月:echo %date:~,% 日:echo %date:~,% 星期:echo %date:~,% 小时:echo %t ...

  6. C#控件数组批量生成控件

    在编写C#窗体应用程序的时候,有时候需要生成好多个功能相似的同一种控件(比如数字键盘按键.单选框等),这时候使用窗体编辑器,费时费力,不便于修改.因此可以采用批量生成控件的形式. 以批量生成按钮为例 ...

  7. PhpStorm+xdebug调试——更新

    之前写过一篇<PhpStorm+xdebug+postman调试>,但是经过后来一段时间的使用,发现有些累赘.这里介绍一种比较简单方便的操作. 在上一篇文章中有一段“ 7.设置Server ...

  8. ps常用指令集

    M DCtrl+ D清空选择区域Ctrl+ R调出标尺

  9. Stm32 GPIO复习

    地点:中图四楼. 1.七个寄存器 配置寄存器:GPIOx_CPL.GPIOx_CPH; 数据寄存器:GPIOx_IDR.GPIOx_ODR: 置位/复位寄存器:GPIOx_BSRR 复位寄存器:GPI ...

  10. html超出显示省略号

    <span>装备自动回收,躺的赚钱,收入比上班还要高,古天乐都乐开了花装备自动回收,躺的赚钱,收入比上班还要高,古天乐都乐开了花装备自动回收,躺的赚钱,收入比上班还要高,古天乐都乐开了花& ...