写在开头:
事件驱动模型已经在前面的文章给大家做了简单而又生动形象的介绍了,接下 来将进行详细的介绍。欢迎关注小哥vx:“编程小哥令狐”。 【项目需求】 开发一个温度实时监测程序,程序能够根据温度的变化提示温度变化情况, 对应发生颜色变化,增强提示效果。 【思路/体会】 温度的实时变化可以通过生成对象调用随机函数,将值动态显示。颜色变化 可以通过Windows .NET库提供的颜色库进行调用。关键是你怎么启动成这个程序 启动了让它自行执行,这个可以启用Timmer控件,设置时间间隔,封装函数,外 部调用即可。整个开发贯穿的就是事件驱动编程的思想。
一.定义事件信息相关类与事件警报器
为什么要谈到委托类型?委托就是一种可以动态调用方法的类型,属于引用型。C#实现事件驱动编程模型的主要途径就是利用委托类型实现动态调用方法。
我们之前总是通过指针或者对象访问变量的内存地址,但现在我们需要利用委托对象引用方法的内存地址实现传递和调用。
1.1第一步声明委托类型
我们自己定义了一个事件数据类型:TemperatureEventArgs
,它还是我们定义的一个类,我们在里面封装好我们需要的数据信息。
我们的类名就是我们的事件数据类型,它同样具有类的所有特性,比如定义构造方法,方法,属性器等等。我们定义的事件数据类型为TemperatureEventArgs
,它是从EventArgs
进行派生的。它的目的就是:
提供保存事件数据所需要的全部字段或者属性,这样事件的发布者就可以将特定的数据发送给接收者。
class TemperatureEventArgs:EventArgs{ private int temperature; //TemperatureEventArgs是一个类 public TemperatureEventArgs(int temperature)//声明构造函数 { this.temperature = temperature; } public int Temperate//定义只读属性 {//专门定义一个Temperature方法来返回数据 get { return temperature; } } }
1.2第二步定义事件警报器:
1.2.1声明我们的委托类型
声明格式就是:
public delegate 返回值类型 委托类型名(object sender,事件数据类型 e);
code:
我们的委托类型名是自定义的哟!
public delegate void TemperatureHandler(object sender, TemperatureEventArgs e);
1.2.2声明事件
声明格式就是:
public event 委托类型名 事件名;
PS: 事件名最好以On_
开头比较规范!
public event TemperatureHandler OnWarning;
1.2.3开始监控气温,同时发布事件
public void Monitor(int tp) { TemperatureEventArgs e = new TemperatureEventArgs(tp); if (OnWarning != null) { OnWarning(this, e); } }
1.2.4声明事件时调用的方法
//第三步 声明事件时调用方法 private void Tw_OnWarning(object sender, TemperatureEventArgs e) { if (e.Temperate < 35) { lblShow.Text = "正常"; lblColor.BackColor = Color.Blue; } else if (e.Temperate < 37) { lblShow.Text = "高温黄色预警"; lblColor.BackColor = Color.Yellow; } else if (e.Temperate < 40) { lblShow.Text = "高温橙色预警"; lblColor.BackColor = Color.Orange; } else if (e.Temperate < 37) { lblShow.Text = "高温红色预警"; lblColor.BackColor = Color.Red; } } }
二.事件调用
写上代码:
private void Tw_OnWarning(object sender, TemperatureEventArgs e) { if (e.Temperate < 35) { lblShow.Text = "正常"; lblColor.BackColor = Color.Blue; } else if (e.Temperate < 37) { lblShow.Text = "高温黄色预警"; lblColor.BackColor = Color.Yellow; } else if (e.Temperate < 40) { lblShow.Text = "高温橙色预警"; lblColor.BackColor = Color.Orange; } else if (e.Temperate < 37) { lblShow.Text = "高温红色预警"; lblColor.BackColor = Color.Red; } }
2.1在事件接收者类中订阅事件
tw.OnWarning += new TemperatureWaring.TemperatureHandler(Tw_OnWarning);
订阅之前先声明好我们的对象
TemperatureWaring tw = new TemperatureWaring();
2.2触发按钮启动计时
我们先设置好我们的timmer,调节时间间隔1000s
代码:
private void btnMonitor_Click(object sender, EventArgs e) { timer1.Enabled = true; } private void timer1_Tick(object sender, EventArgs e) { int nowTemp; if (txtTemp.Text == "") nowTemp = 35; else nowTemp = Convert.ToInt32(txtTemp.Text); int change = r.Next(-2, 3); txtTemp.Text = (change + nowTemp).ToString(); //第五步 触发事件 tw.Monitor(change + nowTemp); }
三.效果图展示
3.1图示
3.2代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace 实例8__3 { public partial class 温度监控 : Form { Random r = new Random(); TemperatureWaring tw = new TemperatureWaring(); public 温度监控() { InitializeComponent(); //第四步 订阅事件 tw.OnWarning += new TemperatureWaring.TemperatureHandler(Tw_OnWarning); } private void btnMonitor_Click(object sender, EventArgs e) { timer1.Enabled = true; } private void timer1_Tick(object sender, EventArgs e) { int nowTemp; if (txtTemp.Text == "") nowTemp = 35; else nowTemp = Convert.ToInt32(txtTemp.Text); int change = r.Next(-2, 3); txtTemp.Text = (change + nowTemp).ToString(); //第五步 触发事件 tw.Monitor(change + nowTemp); } //第三步 声明事件时调用方法 private void Tw_OnWarning(object sender, TemperatureEventArgs e) { if (e.Temperate < 35) { lblShow.Text = "正常"; lblColor.BackColor = Color.Blue; } else if (e.Temperate < 37) { lblShow.Text = "高温黄色预警"; lblColor.BackColor = Color.Yellow; } else if (e.Temperate < 40) { lblShow.Text = "高温橙色预警"; lblColor.BackColor = Color.Orange; } else if (e.Temperate < 37) { lblShow.Text = "高温红色预警"; lblColor.BackColor = Color.Red; } } } } //第一步 定义事件相关信息类 class TemperatureEventArgs : EventArgs { private int temperature; //TemperatureEventArgs是一个类 public TemperatureEventArgs(int temperature)//声明构造函数 { this.temperature = temperature; } public int Temperate//定义只读属性 {//专门定义一个Temperature方法来返回数据 get { return temperature; } } } //第二步:定义事件警报器 class TemperatureWaring { //1.声明委托类型 public delegate void TemperatureHandler(object sender, TemperatureEventArgs e); //2.声明温度预警事件 public event TemperatureHandler OnWarning; //3.开始监控气温,同时发布事件 public void Monitor(int tp) { TemperatureEventArgs e = new TemperatureEventArgs(tp); if (OnWarning != null) { OnWarning(this, e); } } }
3.3代码下载地址
https://jackieling.github.io/Temperature_Control/.
链接:https://pan.baidu.com/s/1gcev1XFanHTPIY2ahJ4d0A
提取码:zgu9