事件可以说是C#中性价比极高的知识,那如何使用事件呢?
假如我想要点击窗口1中的按钮弹出窗口2,然后点击窗口2中的按钮使得原来的窗口1背景色改变
这里就会用到事件。
首先我们如果要使用事件就要对事件有清楚的认识。
举个例子,假如你是一个典狱长,你想要监视一个犯人,如果这个犯人靠近监狱的门就让你的小弟去警告他。
在这个例子里面,犯人就是被监视的类,事件就是犯人靠近监狱门,你就是事件触发后作出相应反应的类。
可以把事件看成灯的开关,当你按下灯的开关后,事件就被触发,灯泡则根据开关的状态选择亮起或熄灭。
回到刚开始的修改背景色问题,要怎么实现代码呢?
- 定义事件(相当于先在犯人的房间里装好摄像头)
- 监听事件
- 触发事件
- 响应事件
创建一个Form1,界面上添加一个按钮
再创建一个form2,然后在form1的按钮上创建form2show出来
form2定义一个事件(<>内部是事件抛出的信息,这里抛出了一个int对象和一个string对象,closeAction是事件的名字)Action表示有参数但是没有返回值的事件
public Action<int,string> CloseAction;
form2中添加一个按钮,在按钮点击代码中添加下面这一句(触发(抛出)事件)
CloseAction?.Invoke(3, "hello");
这一句代码中的?的作用是抛出之前检查有没有对象在监听,如果没有就不去触发,然后回到from1,在form2创建之后调用show()之前加一句代码,加完之后会变成这样
Form2 form2 = new Form2();
form2.CloseAction += doWhenForm2Closed;
form2.Show();
然后你会发现这个doWhenForm2Closed报错,因为你没有定义它,相当于你现在装好了摄像头,也看到了自己想看的东西,但是你没定义好之后自己要做的事情(其实就是一个函数),所以在form1中添加这个函数,函数的返回值为void,参数的类型和数量与定义事件时对应(int,string)
private void doWhenForm2Closed(int a,string b)
{
MessageBox.Show(a.ToString() + b);
}
之后你启动程序,打开form2点击form2中的按钮就会发现doWhenForm2Closed中的代码被调用了,这就完成了一个完整的事件监听(C#中一共有两种事件Action与Func ,Func的定义方法与Action几乎一样,但是Func是有返回值的会把<int,bool,string>中的最后一个数据类型作为返回值,下面为例子)
public Func<string, int> CloseAction2;
CloseAction2?.Invoke("hello2");
private int doWhenForm2Closed2(string b)
{
MessageBox.Show(b);
return 10;
}