這篇文章主要介紹“C#事件處理機制和自定義事件”,在日常操作中,相信很多人在C#事件處理機制和自定義事件問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C#事件處理機制和自定義事件”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
創(chuàng)新互聯(lián)專注于廬山網站建設服務及定制,我們擁有豐富的企業(yè)做網站經驗。 熱誠為您提供廬山營銷型網站建設,廬山網站制作、廬山網頁設計、廬山網站官網定制、微信小程序開發(fā)服務,打造廬山網絡公司原創(chuàng)品牌,更為您提供廬山網站排名全網營銷落地服務。
C#事件處理:了解C#中的預定義事件處理機制
在寫代碼前我們先來熟悉.net框架中和事件有關的類和委托,了解C#中預定義事件的處理。
EventArgs是包含事件數(shù)據的類的基類,用于傳遞事件的細節(jié)。
EventHandler是一個委托聲明如下
public delegate void EventHandler( object sender , EventArgs e )
注意這里的參數(shù),前者是一個對象(其實這里傳遞的是對象的引用,如果是button1的click事件則sender就是button1),后面是包含事件數(shù)據的類的基類。
下面我們研究一下Button類看看其中的事件聲明(使用WinCV工具查看),以Click事件為例。
public event EventHandler Click;
這里定義了一個EventHandler類型的事件Click
前面的內容都是C#在類庫中已經為我們定義好了的。下面我們來看編程時產生的代碼。
private void button1_Click(object sender, System.EventArgs e) { ... }
這是我們和button1_click事件所對應的方法。注意方法的參數(shù)符合委托中的簽名(既參數(shù)列表)。那我們怎么把這個方法和事件聯(lián)系起來呢,請看下面的代碼。
this.button1.Click += new System.EventHandler(this.button1_Click);
把this.button1_Click方法綁定到this.button1.Click事件。
下面我們研究一下C#事件處理的工作流程,首先系統(tǒng)會在為我們創(chuàng)建一個在后臺監(jiān)聽事件的對象(如果是button1的事件那么監(jiān)聽事件的就是button1),這個對象用來產生事件,如果有某個用戶事件發(fā)生則產生對應的應用程序事件,然后執(zhí)行訂閱了事件的所有方法。
C#事件處理:簡單的自定義事件(1)
首先我們需要定義一個類來監(jiān)聽客戶端事件,這里我們監(jiān)聽鍵盤的輸入。
定義一個委托。
public delegate void UserRequest(object sender,EventArgs e);
前面的object用來傳遞事件的發(fā)生者,后面的EventArgs用來傳遞事件的細節(jié),現(xiàn)在暫時沒什么用處,一會后面的例子中將使用。
下面定義一個此委托類型類型的事件
public event UserRequest OnUserRequest;
下面我們來做一個死循環(huán)
public void Run() { bool finished=false; do { if (Console.ReadLine()=="h") { OnUserRequest(this,new EventArgs()); } }while(!finished); }
此代碼不斷的要求用戶輸入字符,如果輸入的結果是h,則觸發(fā)OnUserRequest事件,事件的觸發(fā)者是本身(this),事件細節(jié)無(沒有傳遞任何參數(shù)的EventArgs實例)。我們給這個類取名為UserInputMonitor。
下面我們要做的是定義客戶端的類
首先得實例化UserInputMonitor類 UserInputMonitor monitor=new UserInputMonitor();
然后我們定義一個方法。
private void ShowMessage(object sender,EventArgs e) Console.WriteLine("HaHa!!");
***要做的是把這個方法和事件聯(lián)系起來(訂閱事件),我們把它寫到庫戶端類的構造函數(shù)里。
Client(UserInputMonitor m) { m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage); //m.OnUserRequest+=new m.UserRequest(this.ShowMessage); //注意這種寫法是錯誤的,因為委托是靜態(tài)的 }
下面創(chuàng)建客戶端的實例。
new Client(monitor);
對了,別忘了讓monitor開始監(jiān)聽事件。
monitor.run();
大功告成,代碼如下:
using System; class UserInputMonitor { public delegate void UserRequest(object sender,EventArgs e); //定義委托 public event UserRequest OnUserRequest; //此委托類型類型的事件 public void Run() { bool finished=false; do { if (Console.ReadLine()=="h") { OnUserRequest(this,new EventArgs()); } }while(!finished); } } public class Client { public static void Main() { UserInputMonitor monitor=new UserInputMonitor(); new Client(monitor); monitor.Run(); } private void ShowMessage(object sender,EventArgs e) { Console.WriteLine("HaHa!!"); } Client(UserInputMonitor m) { m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage); //m.OnUserRequest+=new m.UserRequest(this.ShowMessage); //注意這種寫法是錯誤的,因為委托是靜態(tài)的 } }
C#事件處理:進一步研究C#中的預定義事件處理機制
可能大家發(fā)現(xiàn)在C#中有些事件和前面的似乎不太一樣。例如
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { } this.textBox1.KeyPress+=newSystem.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);
這里使用了KeyPressEventArgs而不是EventArgs作為參數(shù)。這里使用了KeyEventHandler委托,而不是EventHandler委托。
KeyPressEventArgs是EventArgs的派生類,而KeyEventHandler的聲明如下
public delegate void KeyEventHandler( object sender , KeyEventArgs e );
是參數(shù)為KeyEventArgs的委托。那為什么KeyPress事件要這么做呢,我們可以從兩個類的構造函數(shù)來找答案。
public EventArgs();
public KeyPressEventArgs(char keyChar);
這里的keyData是什么,是用來傳遞我們按下了哪個鍵的,哈。
我在KeyEventArgs中又發(fā)現(xiàn)了屬性
public char KeyChar { get; }
進一步證明了我的理論。下面我們來做一個類似的例子來幫助理解。
簡單的自定義事件(2)
拿我們上面做的例子來改。
我們也定義一個EventArgs(類似KeyEventArgs)取名MyEventArgs,定義一個構造函數(shù)public MyEventArgs(char keyChar),同樣我們也設置相應的屬性。代碼如下
using System; class MyMyEventArgs:EventArgs { private char keyChar; public MyMyEventArgs(char keyChar) { this.keychar=keychar; } public char KeyChar { get { return keyChar; } } }
因為現(xiàn)在要監(jiān)聽多個鍵了,我們得改寫監(jiān)聽器的類中的do...while部分。改寫委托,改寫客戶端傳遞的參數(shù)。好了最終代碼如下,好累
using System; class MyEventArgs:EventArgs { private char keyChar; public MyEventArgs(char keyChar) { this.keyChar=keyChar; } public char KeyChar { get { return keyChar; } } } class UserInputMonitor { public delegate void UserRequest(object sender,MyEventArgs e); //定義委托 public event UserRequest OnUserRequest; //此委托類型類型的事件 public void Run() { bool finished=false; do { string inputString= Console.ReadLine(); if (inputString!="") OnUserRequest(this,new MyEventArgs(inputString[0])); }while(!finished); } } public class Client { public static void Main() { UserInputMonitor monitor=new UserInputMonitor(); new Client(monitor); monitor.Run(); } private void ShowMessage(object sender,MyEventArgs e) { Console.WriteLine("捕捉到:{0}",e.KeyChar); } Client(UserInputMonitor m) { m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage); //m.OnUserRequest+=new m.UserRequest(this.ShowMessage); //注意這種寫法是錯誤的,因為委托是靜態(tài)的 } }
到此,關于“C#事件處理機制和自定義事件”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
網站欄目:C#事件處理機制和自定義事件
文章URL:http://weahome.cn/article/jhoodg.html