模拟winform里的控件的事件和委托机制

 

 参考:.NET 中的委托

委托的两大用处

1、委托可以实现方法作为参数进行传递,如

/// <summary>
        /// the English speaker.
        /// </summary>
        /// <param name="name">The name.</param>
        public void EnglishSpeaker(string name)
        {
            Console.WriteLine(
                string.Format("Hello my name is {0} and I am English speaker.\n", name));
        }

        /// <summary>
        /// the Chineses speaker.
        /// </summary>
        public void ChineseSpeaker(string name)
        {
            Console.WriteLine(
                string.Format("您好我的名字叫{0},我是讲普通话的。\n", name));
        }


/// <summary>
        /// The base say function.
        /// </summary>
        /// <param name="name">The name.</param>
        /// <param name="speaker">The speaker.</param>
        private static void Say(string name, SpeakDelegate speaker)
        {
            ///Inoke the speaker function.
            speaker(name);
        }


///传递函数名进行委托方法绑定
                       Program.Say("钧航", ChineseSpeaker);
           Program.Say("JK.Rush", EnglishSpeaker);
View Code

2、委托可以进行计算,加减,使得运行委托后就按顺序运行委托所承载的方法

 

namespace Multi_Delegate
{
    delegate void StringProcessor();
    public class Person
    {
        private string _Name;
        public Person(string name)
        {
            this._Name = name;
        }

        public void Say()
        {
            Console.WriteLine("Hello my name is {0}, what's your name.\n", this._Name);
        }

        public void Reply()
        {
            Console.WriteLine("Hello my name is {0} and nice to meet you.\n", this._Name);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person Jack = new Person("Jack");
            Person Oliver = new Person("Oliver");
            StringProcessor sp = null;
//绑定多播方法调用
            sp += Jack.Say;
            sp += Oliver.Reply;
            sp();
            Console.ReadKey();
        }
    }
}
View Code

 

 

 

下面的代码是我模块winform的事件机制,一看就懂。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ClassLibrary.事件
{
    class 模拟控件事件机制
    {

    }

    public class Form1
    {
        MyButton button1;
        public Form1()
        {
            FormIni();
            button1.Text = "111";
        }
        public void FormIni()
        {
            this.button1 = new MyButton("button1");///
            button1.TextChanged += new MyButton.MyButtonTextChangedHandler(Button1OnTextChanged) ;
        }

        void Button1OnTextChanged(object send, MyButtonEventArgs e)
        {
            Console.WriteLine("button1的Text属性改变后调用,MyButtonEventArgs的message信息为:"+e.Message);
        }
    
    }

    /// <summary>
    /// 定义Button
    /// </summary>
    class MyButton
    {
        /// <summary>
        /// 按钮的Text
        /// </summary>
        private string text;    
        public string Text
        {
            get { return text; }
            set { text = value; OnTextChanged(new MyButtonEventArgs(name)); }
        }
        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        public MyButton(string name)
        {
            Name = name;        
        }

        ///定义事件的委托
        public delegate void MyButtonTextChangedHandler(object sender, MyButtonEventArgs e);

        ///定义事件
        public event MyButtonTextChangedHandler TextChanged;
        ///定义引发事件的方法OnTextChanged()
        private void OnTextChanged(MyButtonEventArgs e)
        {
            e.Message = name;          
            Console.WriteLine("MyButton的Text属性改变,MyButton控件的事件TextChanged发生了,转入信息:"+e.Message);
            TextChanged(this, e);///如果没有这一行,MyButton的Text改变后引起的其它操作就不能运行
        }

    }

    /// <summary>
    /// 自定义事件参数
    /// </summary>
    class MyButtonEventArgs
    {
        private string message;///

        public string Message
        {
            get { return message; }
            set { message = value; }
        }


        public MyButtonEventArgs(string message)
        {
            this.message = message;
        }

    }


   
}
View Code

 

posted @ 2015-03-03 12:27  shengyu_kmust  阅读(201)  评论(0编辑  收藏  举报