.NET 中自定義事件的驅(qū)動(dòng)(C#)
(Wonsoft)
在Windows應(yīng)用的開發(fā)過程中,常常會(huì)借助Windows的事件驅(qū)動(dòng)機(jī)制,自己定義事件,使應(yīng)用程序的具有更好的封裝。特別是在基于組件的應(yīng)用開發(fā)中,更能體現(xiàn)其優(yōu)越性。當(dāng)然在MFC中自定義事件是很容易的一件事,但在C#中有其特有的定義模式。
首先定義事件是很容易的一件事,但光定義了事件,而不驅(qū)動(dòng)這個(gè)事件,那么事件的定義就毫無意義。文章通過幾個(gè)實(shí)例來描述C#中自定義事件及其驅(qū)動(dòng)機(jī)制。
事件的驅(qū)動(dòng)方式不同有幾種:1、成員中直接驅(qū)動(dòng);2、屬性變動(dòng)時(shí)驅(qū)動(dòng)。下面舉例分別說明它們的使用方法。
實(shí)例1 :成員中直接驅(qū)動(dòng)(參考1)
- // Step-1: 首先定義一個(gè)新的 EventArgs ,其中包括一個(gè)屬性,用于傳送超過100的結(jié)果值
- // 要注意的是:該類要繼承自系統(tǒng)的 EventArgs 類。需要多個(gè)屬性時(shí)定義方法與 HighValue 類似。
- class LevelHighArgs : EventArgs
- {
- int _highValue = 0;
- public int HighValue
- {
- get { return _highValue; }
- set { _highValue = value; }
- }
- public LevelHighArgs(int _highValue)
- {
- this._highValue = _highValue;
- }
- }
-
- // Step-2: 處理類。在該類中定義委托,和事件處理方法。
- class AddTowInt
- {
- // 委托定義
- public delegate void LevelHigh(object sender, LevelHighArgs e);
- // 委托類型的事件處理方法
- public event LevelHigh OnLevelHigh;
- int _addedValue = 0;
- public int AddedValue
- {
- get { return _addedValue; }
- set { _addedValue = value; }
- }
- public AddTowInt()
- { }
- public void DoAdd(int a1, int a2)
- {
- _addedValue = a1 + a2;
- if (_addedValue > 100)
- {
- LevelHighArgs lha = new LevelHighArgs(_addedValue - 100);
-
- // 在結(jié)果 > 100 時(shí),拋出事件
- OnLevelHigh(this, lha);
- }
- }
- }
-
- // 使用及事件的捕捉
- class Program
- {
- static void Main(string[] args)
- {
- // 計(jì)算程序?qū)ο?nbsp;
- AddTowInt ati = new AddTowInt();
- // 注冊事件處理程序
- ati.OnLevelHigh += new AddTowInt.LevelHigh(ati_OnLevelHigh);
- // 傳送測試數(shù)據(jù)。此時(shí)結(jié)果為 101 會(huì)觸發(fā)事件,可換成 23, 77 調(diào)用會(huì)看到事件沒有觸發(fā)。
- ati.DoAdd(23, 78); // 顯示調(diào)用
- Console.WriteLine(ati.AddedValue);
- Console.ReadLine();
- }
- static void ati_OnLevelHigh(object sender, LevelHighArgs e)
- {
- // 此處 e 中可以看到有一個(gè) HighValue 屬性,該值就是我們定義在 LevelHighArgs 中的屬性
- Console.WriteLine("結(jié)果已經(jīng)超過 100: " + e.HighValue);
- }
- }
實(shí)例2: 成員中直接驅(qū)動(dòng)(參考2)
- //文件名:ChatServer.cs
- public class ChatServer
- {
- public delegate void MyEventHandler(string msg);
- public event MyEventHandler onSendMsg;
- public void SendMsg()
- {
- onSendMsg("開始發(fā)送消息!");
- }
- }
- // 文件名:Form1.cs
- ///////////////////////////////////
- //類事件的處理代碼如下
- private void SendMsgTest()
- {
- //創(chuàng)建ChatServer類的實(shí)例
- ChatServer f_Server;
- f_Server = new Server();
- f_Server.onSendMsg += new Server.MyEventHandler(this.OnSendMsg);
- //調(diào)用 f_Server的SendMsg()函數(shù)
- f_Server.SendMsg();
- }
- //處理 onSendMsg 事件代碼
- protected void OnSendMsg(string msg)
- {
- //輸出調(diào)試信息
- Console.WriteLine(msg);
- }
實(shí)例3:屬性變動(dòng)時(shí)驅(qū)動(dòng)(參考3)
- namespace Test
- {
- class Program
- {
- static void Main(string[] args)
- {
- MonitoringNameChangement M = new MonitoringNameChangement();
- M.NameChanged += new NameChanged(M_NameChanged);
- while (true)
- {
- Console.WriteLine("請輸入一個(gè)新的名字,您將會(huì)看到您自定義的事件會(huì)被執(zhí)行");
- M.ChangeName = Console.ReadLine();
- }
- }
- static void M_NameChanged(string oldName, string NewName)
- {
- Console.WriteLine("******************************************* 名字已經(jīng)改變");
- Console.WriteLine("新名字是: {0} 老名字是: {1}", NewName, oldName);
- Console.WriteLine("******************************************* ");
- }
-
- }
- //定義一個(gè)監(jiān)控名字變化的委托
- public delegate void NameChanged(string oldName, string NewName);
- //定義一個(gè)名字監(jiān)控類
- public class MonitoringNameChangement
- {
- private string name = "老名字";
- public string ChangeName{
- set
- {
- //如果輸入的是全新的名字,則會(huì)調(diào)用監(jiān)控名字的事件,并且存儲(chǔ)新名字
- if (name != value)
- {
- NameChanged(name, value);
- name = value;
- }
- }
- get
- {
- return name;
- }
- }
- //監(jiān)控名字的事件
- public event NameChanged NameChanged;
- }
- }
|