1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > c#自定义事件触发

c#自定义事件触发

时间:2021-05-07 12:14:08

相关推荐

c#自定义事件触发

转自/xiii/p/7006901.html

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 : 0; }}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 == 1)OnInput(this, new MyEventArgs(str[0])); //触发事件elseOnInput(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[9];//声明for (int i = 0; i < Evt.Length; i++){Evt[i] = new MyEvent();//实例化Evt[i].MyID = (i + 1).ToString();//设置ID1~9Evt[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; //设置取消监听elseConsole.WriteLine("您输入了:" + e.InputString);}}

效果:

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。