事件的应用
实例演示
派生与拓展
事件模型的五个组成部分
1,事件的拥有者(event source,对象)
2,事件成员(event,成员)
3,事件的响应者(event subscriber,对象)
4,事件处理器(event handler,成员)-----本质上是一个回调方法
5,事件回调------把事件处理器与事件关联在一起,本质上是一种以委托类型为基础的约定
注意
事件处理器是成员方法
挂接事件处理器的时候,可以使用委托类型,也可以直接使用方法名,这是个语法糖
事件处理器对事件的订阅不是随意的,匹配与否由声明事件时所使用的委托类型来检测
事件可以同步调用也可以异步调用
事件的各种模型
事件的拥有者 订阅 事件的响应者
class Program { static void Main(string[] args) { System.Timers.Timer timer = new System.Timers.Timer();//事件的拥有者 timer.Interval = 1000; Boy boy = new Boy();//事件的响应者 //Elapsed为事件 Action为事件处理器 timer.Elapsed += boy.Action;//订阅操作 timer.Start(); } } class Boy { internal void Action(object sender, ElapsedEventArgs e) { Console.WriteLine("Jump"); } }
事件的拥有者和事件响应者不相同
static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); Form form = new Form(); Controller control = new Controller(form); form.ShowDialog(); } } public class Controller { private Form form; public Controller(Form form) { if (form!=null) { this.form = form; this.form.Click += this.ShowTime; } } private void ShowTime(object sender, EventArgs e) { this.form.Text = DateTime.UtcNow.ToString(); } }
事件的拥有者和事件的响应者是同一个对象
static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); MyForm form = new MyForm(); form.Click += form.Clicked; form.ShowDialog(); } } public class MyForm : Form { internal void Clicked(object sender, EventArgs e) { this.Text = DateTime.UtcNow.ToString(); } }
事件的拥有者是事件响应者的字段成员,事件的响应者用自己的方法订阅着自己字段成员的事件
static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //Application.Run(new Form1()); Button button = new Button(); TextBox textBox = new TextBox(); MyForm myForm = new MyForm(button, textBox); myForm.ShowDialog(); } } public class MyForm : Form { private Button Button; private TextBox TextBox; public MyForm(Button button,TextBox textBox) { this.Button = button; this.TextBox = textBox; this.Controls.Add(this.Button); this.Controls.Add(this.TextBox); this.Button.Text = "Click Me"; this.Button.Top = 100; this.Button.Click += this.showMessage; } private void showMessage(object sender, EventArgs e) { this.TextBox.Text = "233333"; } }