描述C#事件處理程序
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方法完成事件處理
【編輯推薦】