在windows 編程中用到最多的就是控件的事件了,微軟給我們很好的方式,把注意力放到事件執(zhí)行方法的設(shè)計(jì)和編碼上,但是但我們真正弄懂了事件的真正出發(fā)執(zhí)行原理的話,對(duì)我們的編程的提高真是非常榜的,例如在windows編程中 如果我單擊了一個(gè)button按鈕觸發(fā)了button 的click事件 Button1_Click(){} ,但是有時(shí)候我們編程的時(shí)候,不但想要觸發(fā)button 的單擊事件,我還想要把其他的時(shí)間也要調(diào)用下來(lái)順序執(zhí)行,要實(shí)現(xiàn)這種方式,除了在方法最后對(duì)其他方法的調(diào)用,還可以利用將其他需要順序執(zhí)行的方法封裝到button的click 事件的委托對(duì)象中,這樣就能夠順序執(zhí)行毀掉方法列表中的程序了,而這種方式的實(shí)現(xiàn)是以清楚事件觸發(fā)和委托的調(diào)用為前提的。
事件是類和對(duì)象向外界發(fā)出的消息,事件的執(zhí)行是通過(guò)事件委托的方式,調(diào)用我們所準(zhǔn)備好的處理方法,而是先消息的響應(yīng)的。要響應(yīng)某些事件并針對(duì)某些事件執(zhí)行我們意定的方法,需要做到以下幾步:
		
		1、聲明事件委托。
2、聲明事件。
3、添加事件的觸發(fā)方法。
4、添加事件的處理程序(響應(yīng)事件的方法)。
5、將指定的事件處理程序邦定到要處理的事件上(訂閱事件)。
6、用戶信息操作,并觸發(fā)事件(調(diào)用事件的觸發(fā)方法)。
7、通過(guò)事件委托的回調(diào),執(zhí)行我們需要的事件處理程序。
下面我們舉一個(gè)簡(jiǎn)單的自定義事件處理程序的例子(控制臺(tái)程序)
			        //定義delegate
			        public delegate void TestEventHandler(object sender, TestEventArgs e);
			        //用event 關(guān)鍵字聲明事件對(duì)象
			        public event TestEventHandler TestEvent;
			        //事件觸發(fā)方法
			        protected virtual void OnTestEvent(TestEventArgs e)
			        {
			            if (TestEvent != null)
			                TestEvent(this, e);
			        }
			        //引發(fā)事件
			        public void RaiseEvent(char keyToRaiseEvent)
			        {
			            TestEventArgs e = new TestEventArgs(keyToRaiseEvent);
			            OnTestEvent(e);
			        }
			    }
			    //監(jiān)聽(tīng)事件的類
			    public class TestEventListener
			    {
			        //定義處理事件的方法,他與聲明事件的delegate具有相同的參數(shù)和返回值類型
			        public void KeyPressed(object sender, TestEventSource.TestEventArgs e)
			        {
			            Console.WriteLine("發(fā)送者:{0},所按得健為:{1}", sender, e.KeyToRaiseEvent);
			        }
			        //訂閱事件
			        public void Subscribe(TestEventSource evenSource)
			        {
			            evenSource.TestEvent += new TestEventSource.TestEventHandler(KeyPressed);
			        }
			        //取消訂閱事件
			        public void UnSubscribe(TestEventSource evenSource)
			        {
			            evenSource.TestEvent -= new TestEventSource.TestEventHandler(KeyPressed);
			        }
			    }
			    //測(cè)試類
			    public class Test
			    {
			        public static void Main()
			        {
			            //創(chuàng)建事件源對(duì)象
			            TestEventSource es = new TestEventSource();
			            //創(chuàng)建監(jiān)聽(tīng)對(duì)象
			            TestEventListener el = new TestEventListener();
			            //訂閱事件
			            Console.WriteLine("訂閱事件/n");
			            el.Subscribe(es);
			            //引發(fā)事件
			            Console.WriteLine("輸入一個(gè)字符,再按enter鍵");
			            string s = Console.ReadLine();
			            es.RaiseEvent(s.ToCharArray()[0]);
			            //取消訂閱事件
			            Console.WriteLine("/n取消訂閱事件/n");
			            el.UnSubscribe(es);
			            //引發(fā)事件
			            Console.WriteLine("輸入一個(gè)字符,再按enter健");
			            s = Console.ReadLine();
			            es.RaiseEvent(s.ToCharArray()[0]);
			        }
			    }
}
程序執(zhí)行結(jié)果
			輸入一個(gè)字符,再按enter鍵
			aaaa
			發(fā)送者:事件.TestEventSource,所按得健為:a
取消訂閱事件
輸入一個(gè)字符,再按enter健
TestEventListener類。他提供了事件處理程序,并實(shí)現(xiàn)了事件處理程序和事件對(duì)象的邦定,當(dāng)然時(shí)間處理程序可以放在別處, 跟邦定程序(訂閱事件)放在一起便于理解和調(diào)用
Test 類,實(shí)例化自定義事件的事件源對(duì)象,并調(diào)用 TestEventListener類中的Subscribe(es);方法進(jìn)行事件對(duì)象和事件處理程序的邦定(訂閱事件),調(diào)用 TestEventSource類中的RaiseEvent(char keyToRaiseEvent)引發(fā)對(duì)象,并有對(duì)象所指定的委托回調(diào)處理事件。完成整個(gè)自定義事件。
其中 RaiseEvent(char keyToRaiseEvent) 就相當(dāng)于main()一樣是自定義事件的執(zhí)行入口, 從這個(gè)法開(kāi)始---〉調(diào)用事件委托----〉查找訂閱事件程序找到事件所封裝的方法集----〉由委托回調(diào)事件處理程序并傳遞參數(shù)---〉執(zhí)行事件處理程序。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注