C#超简单自定义事件
我知道你为啥点进来,所以不要犹豫了,立刻马上果断创建控制台项目,直接复制下面精干短小而又强大的代码运行:
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#超简单自定义事件的更多相关文章
- .net 中 C# 简单自定义事件实现
个人认为事件处理机制是一种很好的机制 特别是可以方便安全的实现窗口间(子窗口对父窗口,子窗口间等)的消息传递.功能调用 下面展现的源自以前论坛上看到的一套方法,可能记得不大准确,所以可能不规范,我的理 ...
- js简单自定义事件与主动触发事件
var events = { addHandler: function (element, eventType, handler) { if (element.addEventListener) { ...
- JavaScript使用自定义事件实现简单的模块化开发
WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我 ...
- .net自定义事件,经典简单实例代码
1,新建一个控制台应用程序TestDelegate,本项目主要实现:热水器加热,报警器监控,当热水温度达到80度的时候报警器报警这样一个简单的事件处理程序 2,定义委托处理程序 public dele ...
- Abp 领域事件简单实践 <三> 自定义事件
熵片用到的 EntityCreatedEventData<TEntity>,继承自EventData. 我们可以自定义事件: public class TestEvent: EventD ...
- Javascript之自定义事件
Javascript自定义事件,其本质就是观察者模式(又称订阅/发布模式),它的好处就是将绑定事件和触发事件相互隔离开,并且可以动态的添加.删除事件. 下面通过实例,一步一步构建一个具体的Javasc ...
- 跟着《beginning jquery》学写slider插件并借助自定义事件改进它
<beginning jquery>是一本很不错的学习jquery的书,作者的讲解深入浅出,很适合初学者,在最后一章里面,作者把前面所有的点结合起来完成了一个轮播图的jquery插件.实现 ...
- 把C#程序(含多个Dll)合并成一个Exe的超简单方法
开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具.那该怎么办呢? 下文介绍一种超 ...
- 【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】
UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...
随机推荐
- (链表) lintcode 219. Insert Node in Sorted Linked List
Description Insert a node in a sorted linked list. Example Example 1: Input: head = 1->4-> ...
- 【VS】VS2013 未找到与约束contractname 匹配的导出
#事故现场 今天win10更新后,打开vs2013新建项目报错: #解决方案: 1.控制面板->程序->程序和功能,找到 Entity Framework Tools for Visual ...
- BeautifulSoup解析模块
简介: Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式. 使用 from bs4 impor ...
- vue开发常用插件
dependencies axios // 用于请求数据 better-scroll // 用于处理页面列表的滚动,下拉刷新等 fastclick // 用于处理移动设备点击会有300毫秒延迟的问题 ...
- python GUI 之 tkinter
写一个 登陆窗口来学习 tkinter ,还剩下一些问题 代码暂时如下 import tkinter as tk import webbrowser import pickle from tkinte ...
- 第八节: Quartz.Net五大构件之SimpleThreadPool及其四种配置方案
一. 简介 揭秘: SimpleThreadPool是Quartz.Net中自带的线程池,默认个数为10个,代表一个Scheduler同一时刻并发的最多只能执行10个job,超过10个的job需要排队 ...
- luoguo 1306 斐波那契公约数
这题难度不大,主要是小结论:斐波那契第n项和第m项公约数就是第gcd(n,m)项 大概能猜出来,毕竟斐波那契数列反过来实在太像计算公约数的步骤了 日后填坑证明吧
- IDEA15 下运行Scala遇到问题以及解决办法
为了让Scala运行起来还是很麻烦,为了大家方便,还是记录下来: 1.首先我下载的是IDEA的社区版本,版本号为15. 2.下载安装scala插件: 2.1 进入设置菜单. 2.2 点击安装JetBr ...
- L1-Day4
L1-Day4 1.这消息使她非常悲伤. [我的翻译]The message makes she very sad. [标准答案]The news made her very sad. [对比分析]( ...
- Java z 404
problem: relative 与absolute 绝对和相对定位 为什么缩放页面里会有离开的情况 为什么a链接里与文字无法对齐 这么多代码为什么没有最好 用最简单的代码去执行一个相应的命令 实现 ...