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