C#的事件其实就是一种特殊的委托(delegate),关于事件的介绍,采用《C#高级编程(第7版)》中的介绍:
事件基于委托,为委托提供了一种发布/订阅机制。在架构内到处都能看到事件。在W跏s
应用程序中,Button类提供了Cl硖事件。这类事件就是委托。触发Cl澉事件时调用的处理程序方
法需要定义,其参数由委托类型定义。
其实,初学者不必纠结于到底什么是事件。只需要知道如何使用就可以了。事件一般用于对象与对象之间的通信。最常见的用法就是:窗体之间的传值、windows from欢迎界面的制作。下面就以一个小demo来讲解如何使用自定义事件。
自定义事件以及事件参数代码:
///
/// 自定义事件消息
///
public class UserDefinedEventArgs:EventArgs
{
public string Message{get;set;}
}
public class EventHandler
{
//声明事件
public delegate void _messageInfo(UserDefinedEventArgs e);
public static event _messageInfo eventInfo;
/// <summary>
/// 发送消息
/// </summary>
/// <param name="e"></param>
public static void SendMessage(UserDefinedEventArgs e)
{
if(eventInfo!=null)
{
eventInfo(e);
}
}
}
通过事件,制作欢迎界面。由于主窗体初始化时需要加载比较多的数据,所以先显示欢迎界面,数据加载完毕之后,关闭欢迎界面,显示主界面。
创建两个窗体,from1(主窗体),Welcome(欢迎界面窗体)。
form1主要代码:
public Form1()
{
InitializeComponent();
this.Paint += Form1_Paint;
}
bool isFirstLoad = true;
void Form1_Paint(object sender, PaintEventArgs e)
{
if (isFirstLoad)
{
this.Hide();//页面加载时隐藏窗体
isFirstLoad = false;
}
}
BackgroundWorker worker = new BackgroundWorker();//使用backgroundWorkder处理耗时任务,防止界面卡死
private void Form1_Load(object sender, System.EventArgs e)
{
Welcome f = new Welcome();//显示欢迎界面
f.Show();
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
if (!worker.IsBusy)
{
worker.RunWorkerAsync();
}
}
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
EventHandler.SendMessage(new UserDefinedEventArgs());//发送消息
this.Show();//显示主窗体
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
System.Threading.Thread.Sleep(3000);//模拟耗时的任务
}
Welcome主要代码:
public Welcome()
{
InitializeComponent();
EventHandler.eventInfo += EventHandler_eventInfo;//订阅(注册)事件
}
void EventHandler_eventInfo(EventArgs e)
{
this.Close();
}
源代码:
事件demo源代码