C#事件处理程序
我们可以把事件编程简单地分成两个部分:事件发生的类(书面上叫事件发生器)和事件接收处理的类。事件发生的类就是说在这个类中触发了一个事件,但这个类并不知道哪个个对象或方法将会加收到并处理它触发的事件。所需要的是在发送方和接收方之间存在一个媒介。这个媒介在.NET Framework中就是委托(delegate)。在事件接收处理的类中,我们需要有一个处理事件的方法。好了,我们就按照这个顺序来实现一个捕获键盘按键的程序,来一步一步说明如何编写事件应用程序。
1、首先创建一个自己的EventArgs类。
引自MSDN:
EventArgs是包含事件数据的类的基类,此类不包含事件数据,在事件引发时不向C#事件处理程序传递状态信息的事件会使用此类。如果C#事件处理程序需要状态信息,则应用程序必须从此类派生一个类来保存数据。
因为在我们键盘按键事件中要包含按键信息,所以要派生一个KeyEventArgs类,来保存按键信息,好让后面知道按了哪个键。
- internalclassKeyEventArgs:EventArgs
- {
- privatecharkeyChar;
- publicKeyEventArgs(charkeyChar):base()
- {
- this.keyChar=keyChar;
- }
- publiccharKeyChar
- {
- get
- {
- returnkeyChar;
- }
- }
- }
2、再创建一个事件发生的类KeyInputMonitor,这个类用于监控键盘按键的输入并触发一个事件:
- internalclassKeyInputMonitor
- {
- //创建一个委托,返回类型为void,两个参数
- publicdelegatevoidKeyDown(objectsender,KeyEventArgse);
- //将创建的委托和特定事件关联,在这里特定的事件为OnKeyDown
- publiceventKeyDownOnKeyDown;
- publicvoidRun()
- {
- boolfinished=false;
- do
- {
- Console.WriteLine("Inputachar");
- stringresponse=Console.ReadLine();
- charresponseChar=(response=="")?'':char.ToUpper(response[0]);
- switch(responseChar)
- {
- case'X':
- finished=true;
- break;
- default:
- //得到按键信息的参数
- KeyEventArgskeyEventArgs=newKeyEventArgs(responseChar);
- //触发事件
- OnKeyDown(this,keyEventArgs);
- break;
- }
- }while(!finished);
- }
- }
这里注意OnKeyDown( this, KeyEventArgs );一句,这就是触发事件的语句,并将事件交由KeyDown这个委托来处理,委托指定事件处理方法去处理事件,这就是事件接收方的类的事情了。参数this是指触发事件的对象就是本身这个对象,keyEventArgs包含了按键信息。
3、最后创建一个事件接收方的类
这个类先产生一个委托实例,再把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件。然后提供一个方法回显按键信息。
- internalclassEventReceiver
- {
- publicEventReceiver(KeyInputMonitormonitor)
- {
- //产生一个委托实例并添加到KeyInputMonitor产生的事件列表中
- monitor.OnKeyDown+=newKeyInputMonitor.KeyDown(this.Echo);
- }
- privatevoidEcho(objectsender,KeyEventArgse)
- {
- //真正的事件处理函数
- Console.WriteLine("Capturekey:{0}",e.KeyChar);
- }
- }
4、看一下如何调用
- publicclassMainEntryPoint
- {
- publicstaticvoidStart()
- {
- //实例化一个事件发送器
- KeyInputMonitormonitor=newKeyInputMonitor();
- //实例化一个事件接收器
- EventReceivereventReceiver=newEventReceiver(monitor);
- //运行
- monitor.Run();
- }
- }
总结:
C#中使用事件需要的步骤:
1.创建一个委托
2.将创建的委托与特定事件关联(.Net类库中的很多事件都是已经定制好的,所以他们也就有相应的一个委托,在编写关联C#事件处理程序--也就是当有事件发生时我们要执行的方法的时候我们需要和这个委托有相同的签名)
3.编写C#事件处理程序
4.利用编写的C#事件处理程序生成一个委托实例
5.把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件
C#中事件产生和实现的流程:
1.定义A为产生事件的实例,a为A产生的一个事件
2.定义B为接收事件的实例,b为处理事件的方法
3.A由于用户(程序编写者或程序使用者)或者系统产生一个a事件(例如点击一个Button,产生一个Click事件)
4.A通过事件列表中的委托对象将这个事件通知给B
5.B接到一个事件通知(实际是B.b利用委托来实现事件的接收)
6.调用B.b方法完成事件处理
【编辑推荐】