标签:close 设计模式 console public mamicode 图片 spl 自动 cli
定义:Event "事件"-----能够发生什么事件
角色:使对象或类具有通知能力的成员
使用:用于对象或类间的动作协调与信息传递(消息推送)
原理:事件模型(event model)中的两个“5”
“发生--响应” 中的五个部分
“发生--响应” 中的五个动作
首先简单一个Demo看下事件的使用:
namespace EventExample { class Program { static void Main(string[] args) { // 事件五要素:事件拥有者 timer; // 事件 Elapsed // 事件响应者 Boy对象 // 事件处理器 Action方法 // 事件订阅 Timer timer = new Timer(); timer.Interval = 1000; Boy boy = new Boy(); timer.Elapsed += boy.Action; timer.Elapsed += Girl.Action; timer.Start(); Console.ReadLine(); } } class Boy { internal void Action(object sender, ElapsedEventArgs e) { Console.WriteLine("Jump!"); } } class Girl { internal static void Action(object sender,ElapsedEventArgs e) { Console.WriteLine("Singing"); } } }
事件五个部分的组成关系
(1)事件的拥有者和事件的响应者是完全不同的两个对象-
MVC\MVP等设计模式的雏形
namespace Event1 { class Program { //事件拥有者 form //事件 Click //事件响应值 controller //事件处理器 FormClicked //订阅 this.form.Click += this.FormClicked; static void Main(string[] args) { Form form = new Form(); Controller controller = new Controller(form); form.ShowDialog(); } } class Controller { private Form form; public Controller(Form form) { if(form!=null) { this.form = form; this.form.Click += this.FormClicked; } } private void FormClicked(object sender, EventArgs e) { this.form.Text = DateTime.Now.ToString(); } }
(2)事件的拥有者和事件的响应者是一个对象
声明一个form对象,能否添加它的一个方法,自己处理它的click事件呢?
可以发现此时按 ctrl+“.” 已经无法出现智能提示,帮助我们自动生成事件处理器
原因:
因为form类是微软已经编写好的一个类,此时我们已经无法对它进行修改 ,解决办法是自己声明一个类去继承form类
static void Main(string[] args) { MyForm form = new MyForm(); form.Click += form.FormClicked; form.ShowDialog(); } } class MyForm : Form { internal void FormClicked(object sender, EventArgs e) { this.Text = DateTime.Now.ToString(); } }
(3)最常见的是这种,事件拥有者是事件响应者的一个字段成员,事件的响应者用自己的一个方法订阅着自己的字段成员的某个事件。
Demo:在一个窗口里有一个文本框和一个按钮,点击按钮,文本框显示“Hello World”
微软为我们准备的窗口form类进行显示的时候就是一个光板
此时若我们想为他添加按钮【即想让一个类既具有某个类的功能,又想添加新的功能,即派生(类的继承)】
//事件拥有者button
//事件 Click
//事件响应者 MyForm的对象
//事件处理器 ButtonClicked
//订阅
这个非可视化编程,只是为了理解好这个模型。
可视化编程:用vs的所见即所得的winform。手动添加事件处理器拖拉控件到窗体
右击打开代码
声明方法
namespace WindowsFormsApp2 { public partial class MyForm : Form { public MyForm() { InitializeComponent(); this.myButton.Click += MyButton_Click; } private void MyButton_Click(object sender, EventArgs e) { this.myTextbox.Text = "Hello World"; } } }
自动添加事件处理器:点击button按钮 然后到属性栏,点击小
,可以找到click事件,直接双击即可生成
namespace WindowsFormsApp2 { public partial class MyForm : Form { public MyForm() { InitializeComponent(); } private void MyButton_Click_1(object sender, EventArgs e) { this.myTextbox.Text = "Hello World"; } } }
可以发现事件订阅不在代码中,因为在后台代码中
一个练习的Demo
namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); this.button3.Click += new EventHandler(this.ButtonClick); } private void ButtonClick(object sender, EventArgs e) { if(sender==button1) { this.textBox1.Text = "Hello"; } if (sender == button2) { this.textBox1.Text = "World"; } if (sender == button3) { this.textBox1.Text = "Haha"; } } } }
其他学习点:
事件挂接多种方式
(1)用 “+=”
this.button3.Click += this.ButtonClick;
(2)用EventHandler委托
this.button3.Click += new EventHandler(this.ButtonClick);
(3)匿名方法(已过时)
this.button3.Click += delegate (object sender, EventArgs e) { this.textBox1.Text = "Mr.right"; }; //注意分号别忘了
(3) lamda
this.button3.Click += (object sender, EventArgs e) =>{
this.textBox1.Text = "Me.right";
};
思考:
一个事件可不可以挂接多个事件处理器 ---可以 (第一个timer的例子)
一个事件处理器可不可以被多个事件挂接---可以 (ButtonClick处理器被多个button挂接)
以上学习了事件模型的五个组成部分及其常见的组合方式,以及如何使用厂商为我们准备好的事件。如button的click事件, timer的Elapsed事件
# 自律即是自由 #
标签:close 设计模式 console public mamicode 图片 spl 自动 cli
原文地址:https://www.cnblogs.com/lxq6701/p/11364718.html