亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺析C#的事件處理和自定義事件

2019-11-18 19:47:58
字體:
來源:轉載
供稿:網友

一、了解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#在類庫中已經為我們定義好了的。下面我們來看編程時產生的代碼。

        PRivate void button1_Click(object sender, System.EventArgs e)
        {
            ...
        }

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

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

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

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

二、簡單的自定義事件(1)

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

    定義一個委托。

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

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

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

        public event UserRequest OnUserRequest;

    下面我們來做一個死循環

        public void Run()      {      bool finished=false;      do      {       if (Console.ReadLine()=="h")       {        OnUserRequest(this,new EventArgs());       }        }while(!finished);      }

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

   下面我們要做的是定義客戶端的類
    首先得實例化UserInputMonitor類
       UserInputMonitor monitor=new UserInputMonitor();

    然后我們定義一個方法。

       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);

      //注意這種寫法是錯誤的,因為委托是靜態的

     }

     下面創建客戶端的實例。

         new Client(monitor);

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

        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);  //注意這種寫法是錯誤的,因為委托是靜態的 }}
三、進一步研究C#中的預定義事件處理機制

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

      private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
      {

      }

      this.textBox1.KeyPress+=newSystem.Windows.Forms.KeyPressEventHandler(this.textBox1_KeyPress);

    這里使用了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),同樣我們也設置相應的屬性。代碼如下

using System;class MyMyEventArgs:EventArgs{ private char keyChar; public MyMyEventArgs(char keyChar) {  this.keychar=keychar; } public char KeyChar {  get  {   return keyChar;  } }}

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

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);  //注意這種寫法是錯誤的,因為委托是靜態的 }}
 

本人水平有限,所以錯誤難免,極其歡迎大家批評指正。

renrenQQ(ddlly)     EMail: ddlly@tom.com,    QQ24008122


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品午夜视频| 日韩在线资源网| 成人写真福利网| 国产精品人成电影| 欧美另类极品videosbest最新版本| 一本色道久久88精品综合| 亚洲欧美一区二区精品久久久| 8050国产精品久久久久久| 日韩在线观看网站| 国产精品h片在线播放| 久久天天躁狠狠躁夜夜躁2014| 国产99视频在线观看| 成人免费视频网址| 中文字幕亚洲字幕| 欧洲午夜精品久久久| 4438全国成人免费| 国产精品欧美风情| 国产做受高潮69| 国产精品高精视频免费| 久久精品国产欧美亚洲人人爽| 欧美精品电影免费在线观看| 国产精品av在线播放| 亚洲午夜精品久久久久久性色| 国产91在线高潮白浆在线观看| 欧美精品日韩三级| 91牛牛免费视频| 日韩精品久久久久久福利| 欧美激情中文网| 欧美一区二粉嫩精品国产一线天| 国产亚洲综合久久| 亚洲国产97在线精品一区| 欧美日韩国产在线播放| 日韩中文字幕在线免费观看| 亚洲第一二三四五区| 精品久久久免费| 国产91精品最新在线播放| 国产一区二区三区四区福利| 欧美理论片在线观看| 欧美日韩在线看| 日韩精品中文在线观看| 国产精品狼人色视频一区| 亚洲aⅴ男人的天堂在线观看| 国产欧美日韩中文| 亚洲成年人在线播放| 最近2019年日本中文免费字幕| 国产一区二区三区在线观看视频| 奇门遁甲1982国语版免费观看高清| 81精品国产乱码久久久久久| 亚洲网站在线看| 欧美老女人xx| 亚洲成人av资源网| 91黑丝在线观看| 国产免费久久av| 欧美日韩综合视频| 国产精欧美一区二区三区| 97在线观看视频国产| 久久精品99国产精品酒店日本| 国产欧美精品xxxx另类| 久久久久久久国产精品| 日本欧美在线视频| 亚洲精品理论电影| 午夜精品久久久久久久99热浪潮| 国产成人福利网站| 亚洲人成欧美中文字幕| 国产精品普通话| 韩国19禁主播vip福利视频| 亚洲福利视频在线| 国产日韩中文字幕在线| 精品综合久久久久久97| 久久夜精品va视频免费观看| 久久久免费av| 2024亚洲男人天堂| 午夜欧美不卡精品aaaaa| 日韩国产精品亚洲а∨天堂免| 色综合伊人色综合网站| 国产精品丝袜久久久久久高清| 国产精品色视频| 伊人久久精品视频| 92看片淫黄大片看国产片| 欧美国产日韩中文字幕在线| 亚洲aa在线观看| 国产日韩精品在线播放| 91夜夜揉人人捏人人添红杏| 日韩av电影免费观看高清| 日韩免费黄色av| 久久久精品一区二区| 九九精品在线播放| 精品亚洲一区二区三区在线播放| 成人精品一区二区三区电影黑人| 亚洲最新在线视频| 日韩成人av网| 欧美自拍大量在线观看| 国产成+人+综合+亚洲欧洲| 成人午夜高潮视频| 一区二区三区黄色| 欧美激情一二三| 亚洲成人久久网| 91成人在线播放| 久久影视三级福利片| 91精品国产自产91精品| 亚洲精品欧美日韩专区| 国产97在线观看| 久久91精品国产91久久久| 日韩一区二区在线视频| 91夜夜揉人人捏人人添红杏| 91丝袜美腿美女视频网站| 国内精品中文字幕| 亚洲伦理中文字幕| 欧美小视频在线| 欧美激情欧美狂野欧美精品| 992tv成人免费视频| 久久久久久18| 大胆欧美人体视频| 亚洲精品mp4| 国产精品主播视频| 国产精品久久久久久久久| 亚洲三级av在线| 日韩欧美中文在线| 九九精品在线观看| 亚洲第一页中文字幕| 成人国产精品日本在线| 久久99久久久久久久噜噜| 日韩av三级在线观看| 最近更新的2019中文字幕| 精品久久久视频| 欧美大片在线看免费观看| 91超碰caoporn97人人| 亚洲欧美日韩一区在线| 亚洲欧洲av一区二区| 欧美另类老女人| 日韩在线一区二区三区免费视频| 亚洲欧美国产制服动漫| 亚洲欧美激情在线视频| 久久久这里只有精品视频| 亚洲精品久久久久久久久久久久久| 国产精品一区久久| 91大神福利视频在线| 精品国内产的精品视频在线观看| 久久国产精品99国产精| 国产精品久久久久久久久免费| 国产精品久久91| 国产视频精品va久久久久久| 色综合视频一区中文字幕| 欧美日韩美女在线观看| 亚洲一区制服诱惑| 一区二区三区亚洲| 国产成人精品国内自产拍免费看| 国产日韩在线观看av| 亚洲欧美另类国产| 揄拍成人国产精品视频| 91视频九色网站| 久久免费视频观看| 亚洲欧美999| 欧美激情精品久久久久久久变态| 亚洲欧美日韩第一区| 中文字幕亚洲无线码在线一区| 97人洗澡人人免费公开视频碰碰碰| 欧美一区二区大胆人体摄影专业网站| 久久韩国免费视频| 久久精品国产成人精品| 欧美性20hd另类| 欧美人与物videos| 亚洲成人av在线播放| 欧洲美女7788成人免费视频|