模拟winform里的控件的事件和委托机制
参考:.NET 中的委托
委托的两大用处
1、委托可以实现方法作为参数进行传递,如
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <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);
2、委托可以进行计算,加减,使得运行委托后就按顺序运行委托所承载的方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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(); } } }
下面的代码是我模块winform的事件机制,一看就懂。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; } } }