聲明事件
首先我們需要聲明事件,也就是創造事件。
public event EventHandler RaiseCustomEvent;
public event CustomEventHandler RaiseCustomEvent;
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
解釋(有三種方法):
- 如果沒有任何自定義 EventArgs 類,事件類型將爲非泛型 EventHandler 委託;
- 使用非泛型版本 EventHandler
並且具有派生自 EventArgs 的自定義類,請聲明發布類中的事件; - 如果使用泛型版本,則無需自定義委託;
例子
public event EventHandler<CustomEventArgs> RaiseCustomEvent;
這句話相當於:
public delegate void CustomEventHandler( object sender, CustomEventArgs e );
public event CustomEventHandler RaiseCustomEvent;
public class CustomEventArgs : EventArgs
{
public CustomEventArgs(string s)
{
message = s;
}
private string message;
public string Message
{
get { return message; }
set { message = value; }
}
}
註冊事件
然後某些地方可能會需要把自己的響應函數或者其它給註冊都對應事件中去。
註冊事件時,我們需要獲取到我們之前創造的事件,我們可以爲事件系統寫一個全局的靜態函數來操作,也可以通過對象來操作,我的想法是可以創造一個單例。
註冊:
RaiseCustomEvent += HandleCustomEvent;
這裏的HandleCustomEvent必須對應爲我們之前創造(聲明)事件時的委託或者是lambda表達式。
比如:
void HandleCustomEvent(object sender, CustomEventArgs e)
{
Console.WriteLine(" received this message: {0}", e.Message);
}
因爲我們前面是寫的CustomEventArgs, 所以我們的響應函數,或者叫回調函數的類型就得是委託類型。
事件的調用
參數:
CustomEventArgs e
調用:
RaiseCustomEvent( this(對象) , e);
這裏的this指觸發事件的對象,比如上面的sender。比如我們的一個按鈕被點擊了,這個按鈕就是這個對象,然後我們的事件參數e裏面可以包含一些我們想要的信息,比如打開,關閉等命令。然後對應的接收方收到消息後,就會調用自己的回調函數,比如關閉自己的什麼東西,打開什麼東西。