在windows 編程中用到最多的就是控制項的事件了,微軟給我們很好的方式,把注意力放到事件執行方法的設計和編碼上,但是但我們真正弄懂了事件的真正出發執行原理的話,對我們的編程的提高真是非常有協助的,例如在windows編程中,如果我單擊了一個button按鈕觸發了button 的click事件 Button1_Click(){} ,但是我們編程的時候,不但想要觸發button 的單擊事件,還想要把其他的事件接下來順序執行,要實現這種方式,除了在方法最後對其他方法的調用,還可以利用將其他需要順序執行的方法封裝到button的click 事件的委派物件中,這樣就能夠順序執行回調方法列表中的程式了,而這種方式的實現是以清除事件觸發和委託的調用為前提的。
1、聲明事件委託。
2、聲明事件。
3、添加事件的觸發方法。
4、添加事件的處理常式(響應事件的方法)。
5、將指定的事件處理常式邦定到要處理的事件上(訂閱事件)。
6、使用者資訊操作,並觸發事件(呼叫事件的觸發方法)。
7、通過事件委託的回調,執行我們需要的事件處理常式。
下面我們舉一個簡單的自訂事件處理常式的例子(控制台程式)
using System;
//using System.Collections.Generic;
namespace TestEvent
{
//發布事件的類
public class TestEventSource
{
//定義事件參數類
public class TestEventArgs : EventArgs
{
public readonly char KeyToRaiseEvent;
public TestEventArgs(char keyToRaiseEvent)
{
KeyToRaiseEvent = keyToRaiseEvent;
}
}
//定義delegate
public delegate void TestEventHandler(object sender, TestEventArgs e);
//用event 關鍵字聲明事件對象
public event TestEventHandler TestEvent;
//用泛型委派代替自訂委託
//public event EventHandler<TestEventSource.TestEventArgs> TestEvent;
//事件觸發方法
protected virtual void OnTestEvent(TestEventArgs e)
{
if (TestEvent != null)
TestEvent(this, e);
}
//引發事件
public void RaiseEvent(char keyToRaiseEvent)
{
TestEventArgs e = new TestEventArgs(keyToRaiseEvent);
OnTestEvent(e);
}
}
//監聽事件的類
public class TestEventListener
{
//定義處理事件的方法,他與聲明事件的delegate具有相同的參數和傳回值類型
public void KeyPressed(object sender, TestEventSource.TestEventArgs e)
{
Console.WriteLine("寄件者:{0},所按得健為:{1}", sender, e.KeyToRaiseEvent);
}
//訂閱事件
public void Subscribe(TestEventSource evenSource)
{
evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);
//evenSource.TestEvent += new EventHandler<TestEventSource.TestEventArgs>(KeyPressed);
}
//取消訂閱事件
public void UnSubscribe(TestEventSource evenSource)
{
evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);
//evenSource.TestEvent -= new EventHandler<TestEventSource.TestEventArgs>(KeyPressed);
}
}
//測試類別
public class Test
{
public static void Main()
{
//建立事件來源對象
TestEventSource es = new TestEventSource();
//建立監聽對象
TestEventListener el = new TestEventListener();
//訂閱事件
Console.WriteLine("訂閱事件\n");
el.Subscribe(es);
//引發事件
Console.WriteLine("輸入一個字元,再按enter鍵");
string s = Console.ReadLine();
es.RaiseEvent(s.ToCharArray()[0]);
//取消訂閱事件
Console.WriteLine("\n取消訂閱事件\n");
el.UnSubscribe(es);
//引發事件
Console.WriteLine("輸入一個字元,再按enter健");
s = Console.ReadLine();
es.RaiseEvent(s.ToCharArray()[0]);
}
}
}
原文連結:http://www.cnblogs.com/huomm/MyArticles.html