• 模拟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.
    ", name));
            }
    
            /// <summary>
            /// the Chineses speaker.
            /// </summary>
            public void ChineseSpeaker(string name)
            {
                Console.WriteLine(
                    string.Format("您好我的名字叫{0},我是讲普通话的。
    ", 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.
    ", this._Name);
            }
    
            public void Reply()
            {
                Console.WriteLine("Hello my name is {0} and nice to meet you.
    ", 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
  • 相关阅读:
    spring boot RESTfuldemo测试类
    再谈Redirect(客户端重定向)和Dispatch(服务器端重定向)
    HTTP协议解析
    HTTP协议详解(真的很经典)
    JMeter进行简单的数据库(mysql)压力测试
    LoadRunner利用ODBC编写MySql脚本
    性能瓶颈的分析
    bug的处理流程
    Loadrunner11 录制手机App脚本多种方法介绍
    利用fiddler录制脚本
  • 原文地址:https://www.cnblogs.com/shengyu-kmust/p/4310658.html
Copyright © 2020-2023  润新知