c# 自訂事件和委託)

來源:互聯網
上載者:User

在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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.