成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#事件處理和自定義事件

開發 后端
本文分析了C#中事件處理并且舉例自定義事件。首先我們需要定義一個類來監聽客戶端事件,這里我們監聽鍵盤的輸入。

C#事件處理:了解C#中的預定義事件處理機制

在寫代碼前我們先來熟悉.net框架中和事件有關的類和委托,了解C#中預定義事件的處理。

EventArgs是包含事件數據的類的基類,用于傳遞事件的細節。

EventHandler是一個委托聲明如下

public delegate void EventHandler( object sender , EventArgs e )

注意這里的參數,前者是一個對象(其實這里傳遞的是對象的引用,如果是button1的click事件則sender就是button1),后面是包含事件數據的類的基類。

下面我們研究一下Button類看看其中的事件聲明(使用WinCV工具查看),以Click事件為例。

public event EventHandler Click;

這里定義了一個EventHandler類型的事件Click

前面的內容都是C#在類庫中已經為我們定義好了的。下面我們來看編程時產生的代碼。

  1. private void button1_Click(object sender, System.EventArgs e)  
  2. {  
  3.     ...  

這是我們和button1_click事件所對應的方法。注意方法的參數符合委托中的簽名(既參數列表)。那我們怎么把這個方法和事件聯系起來呢,請看下面的代碼。       

  1. this.button1.Click += new System.EventHandler(this.button1_Click);  

把this.button1_Click方法綁定到this.button1.Click事件。

下面我們研究一下C#事件處理的工作流程,首先系統會在為我們創建一個在后臺監聽事件的對象(如果是button1的事件那么監聽事件的就是button1),這個對象用來產生事件,如果有某個用戶事件發生則產生對應的應用程序事件,然后執行訂閱了事件的所有方法。

C#事件處理:簡單的自定義事件(1)

首先我們需要定義一個類來監聽客戶端事件,這里我們監聽鍵盤的輸入。

定義一個委托。

public delegate void UserRequest(object sender,EventArgs e);

前面的object用來傳遞事件的發生者,后面的EventArgs用來傳遞事件的細節,現在暫時沒什么用處,一會后面的例子中將使用。

下面定義一個此委托類型類型的事件

public event UserRequest OnUserRequest;

下面我們來做一個死循環

 

  1. public void Run()       
  2.  
  3.  {        
  4.  
  5. bool finished=false;       
  6.  
  7.  do        
  8.  
  9. {        
  10.  
  11.  if (Console.ReadLine()=="h")        
  12.  
  13.  {         
  14.  
  15.  OnUserRequest(this,new EventArgs());        
  16.  
  17.  }          
  18.  
  19. }while(!finished);       
  20.  
  21.  }  

此代碼不斷的要求用戶輸入字符,如果輸入的結果是h,則觸發OnUserRequest事件,事件的觸發者是本身(this),事件細節無(沒有傳遞任何參數的EventArgs實例)。我們給這個類取名為UserInputMonitor。

下面我們要做的是定義客戶端的類

首先得實例化UserInputMonitor類       UserInputMonitor monitor=new UserInputMonitor();

然后我們定義一個方法。

  1. private void ShowMessage(object sender,EventArgs e)  
  2.  
  3.    Console.WriteLine("HaHa!!");  

***要做的是把這個方法和事件聯系起來(訂閱事件),我們把它寫到庫戶端類的構造函數里。

  1. Client(UserInputMonitor m)  
  2. {  
  3.  m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);  
  4.  //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);  
  5.  
  6.  //注意這種寫法是錯誤的,因為委托是靜態的  
  7.  
  8. }  

下面創建客戶端的實例。

new Client(monitor);

對了,別忘了讓monitor開始監聽事件。

monitor.run();

大功告成,代碼如下:

  1. using System;  
  2. class UserInputMonitor  
  3. {   
  4. public delegate void UserRequest(object sender,EventArgs e);   
  5. //定義委托  
  6. public event UserRequest OnUserRequest;   
  7. //此委托類型類型的事件   
  8. public void Run()   
  9. {   
  10. bool finished=false;    
  11. do   
  12.  {  
  13.    if (Console.ReadLine()=="h")  
  14.    {  
  15.     OnUserRequest(this,new EventArgs());  
  16.    }   
  17.    }while(!finished);  
  18.  }  
  19. }  
  20.     public class Client  
  21. {  
  22.  public static void Main()  
  23.  {  
  24.   UserInputMonitor monitor=new UserInputMonitor();  
  25.   new Client(monitor);  
  26.   monitor.Run();  
  27.  }  
  28.  private void ShowMessage(object sender,EventArgs e)  
  29.  {  
  30.   Console.WriteLine("HaHa!!");  
  31.  }  
  32.  Client(UserInputMonitor m)  
  33.  {  
  34.   m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);  
  35.   //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);  
  36.   //注意這種寫法是錯誤的,因為委托是靜態的  
  37.  }  

C#事件處理:進一步研究C#中的預定義事件處理機制

可能大家發現在C#中有些事件和前面的似乎不太一樣。例如     

  1. private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)  
  2.       {  
  3.  
  4.       }  
  5.  
  6.       this.textBox1.KeyPress+=newSystem.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);  
  7.  

這里使用了KeyPressEventArgs而不是EventArgs作為參數。這里使用了KeyEventHandler委托,而不是EventHandler委托。

KeyPressEventArgs是EventArgs的派生類,而KeyEventHandler的聲明如下

public delegate void KeyEventHandler( object sender , KeyEventArgs e );

是參數為KeyEventArgs的委托。那為什么KeyPress事件要這么做呢,我們可以從兩個類的構造函數來找答案。

public EventArgs();

public KeyPressEventArgs(char keyChar);

這里的keyData是什么,是用來傳遞我們按下了哪個鍵的,哈。

我在KeyEventArgs中又發現了屬性

public char KeyChar { get; }

進一步證明了我的理論。下面我們來做一個類似的例子來幫助理解。

簡單的自定義事件(2)

拿我們上面做的例子來改。

我們也定義一個EventArgs(類似KeyEventArgs)取名MyEventArgs,定義一個構造函數public MyEventArgs(char keyChar),同樣我們也設置相應的屬性。代碼如下

  1. using System;  
  2. class MyMyEventArgs:EventArgs  
  3. {  
  4.  private char keyChar;  
  5.  public MyMyEventArgs(char keyChar)  
  6.  {  
  7.   this.keychar=keychar;  
  8.  }  
  9.  public char KeyChar  
  10.  {  
  11.   get 
  12.   {  
  13.    return keyChar;  
  14.   }  
  15.  }  

因為現在要監聽多個鍵了,我們得改寫監聽器的類中的do...while部分。改寫委托,改寫客戶端傳遞的參數。好了最終代碼如下,好累

  1. using System;  
  2. class MyEventArgs:EventArgs  
  3. {  
  4.  private char keyChar;  
  5.  public MyEventArgs(char keyChar)  
  6.  {  
  7.   this.keyChar=keyChar;  
  8.  }  
  9.  public char KeyChar  
  10.  {  
  11.   get 
  12.   {   
  13.   return keyChar;  
  14.   }  
  15.  }  
  16. }  
  17. class UserInputMonitor  
  18. {  
  19.  public delegate void UserRequest(object sender,MyEventArgs e);  
  20.  //定義委托  
  21.  public event UserRequest OnUserRequest;  
  22.  //此委托類型類型的事件  
  23.  public void Run()  
  24.  {  
  25.   bool finished=false;  
  26.   do 
  27.   {  
  28.    string inputString= Console.ReadLine();  
  29.    if (inputString!="")   
  30.     OnUserRequest(this,new MyEventArgs(inputString[0]));  
  31.   }while(!finished);  
  32.  }  
  33. }  
  34. public class Client  
  35. {  
  36.  public static void Main()  
  37.  {  
  38.   UserInputMonitor monitor=new UserInputMonitor();  
  39.   new Client(monitor);  
  40.   monitor.Run();   
  41. }  
  42.  private void ShowMessage(object sender,MyEventArgs e)  
  43.  {  
  44.   Console.WriteLine("捕捉到:{0}",e.KeyChar);  
  45.  }  
  46.  Client(UserInputMonitor m)  
  47.  {  
  48.   m.OnUserRequest+=new UserInputMonitor.UserRequest(this.ShowMessage);  
  49.   //m.OnUserRequest+=new m.UserRequest(this.ShowMessage);   
  50.  //注意這種寫法是錯誤的,因為委托是靜態的  
  51.  }  

【編輯推薦】

  1. C#基礎知識一覽
  2. 學習C#自定義用戶控件
  3. C#自定義組件和用戶組件屬性的設置
  4. C#編程中的組件-事件-委托
  5. Visual C#自定義組件的設計:Pop3Com組件
責任編輯:book05 來源: csdn
相關推薦

2009-08-04 13:53:58

C#委托類C#事件

2009-09-03 15:46:57

C#自定義事件

2009-08-04 12:56:51

C#自定義事件

2009-08-04 12:40:34

c#自定義事件

2009-08-04 13:31:35

C#自定義事件

2009-08-07 17:57:26

C#定義事件應用

2009-08-12 15:20:21

C#事件處理

2009-08-27 18:02:22

C#事件處理

2009-08-12 18:28:09

C#事件處理程序

2012-05-25 12:57:31

Windows Pho

2022-05-07 10:22:32

JavaScript自定義前端

2021-08-11 14:29:20

鴻蒙HarmonyOS應用

2009-08-05 18:01:20

C#自定義異常處理

2009-08-04 08:58:01

C#自定義特性

2010-08-13 11:34:54

Flex自定義事件

2009-09-07 15:21:38

Java與C#事件處理

2010-08-12 09:45:33

jQuery自定義事件

2009-08-27 16:53:01

C#委托C#事件

2009-08-31 09:20:37

C#事件注冊和注銷

2021-02-18 08:19:21

Vue自定義Vue 3.0
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲三级av| 精品av| 99精品一区 | 国产成人精品综合 | 涩涩视频在线看 | 1区2区3区视频 | 黑人粗黑大躁护士 | 一区二区三区国产 | 国产激情一区二区三区 | 99爱在线免费观看 | 亚洲欧美日韩精品久久亚洲区 | 国产一区91精品张津瑜 | 亚洲综合一区二区三区 | 亚洲一区二区视频在线播放 | 91精品亚洲 | 亚洲综合色视频在线观看 | 国产一区二区在线观看视频 | 亚洲欧美一区二区三区情侣bbw | 一区二区三区高清 | av在线电影网站 | 高清一区二区三区 | 亚洲成人国产综合 | 久久亚洲美女 | 亚洲国产成人精品久久久国产成人一区 | 盗摄精品av一区二区三区 | 欧美在线一区视频 | 精品欧美一区二区中文字幕视频 | 欧美lesbianxxxxhd视频社区 | 91精品国模一区二区三区 | 男人的天堂亚洲 | 久久久久中文字幕 | 性色av网站 | 精品国产一区一区二区三亚瑟 | 日韩欧美综合在线视频 | 成人av播放 | 成人1区 | 日韩中文字幕 | 酒色成人网 | 天天干天天爽 | 日本在线播放一区二区 | 国产成人av在线 |