using System;
using System.ComponentModel;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public delegate void ActionEventHandler(object sender, ActionCancelEventArgs ev);//声明一个delegate
public static event ActionEventHandler Action;//声明一个名为Action的事件
string _time = "";
public Form1()
{
InitializeComponent();
Form1.Action += new ActionEventHandler(Form1_Action);//为事件Action增加处理程序(即通过ActionEventHandler这个delegate来调用Form1_Action)
}
private void Form1_Action(object sender, ActionCancelEventArgs ev) //这里的方法签名必须与ActionEventHandler的声明签名相同
{
ev.Cancel = DoAction();//调用DoAction,根据当前时间是否超过30秒,决定是否取消事件(小于30秒取消,反之继续)
if (ev.Cancel)
{
ev.Message = "当前时间小于30秒,事件被取消"; //如果取消,设置ev的Message属性
}
}
/// <summary>
/// 判断当前时间是否超过30秒
/// </summary>
/// <returns>小于30秒,返回true,反之返回false</returns>
private bool DoAction()
{
bool retVal = false;
DateTime tm = DateTime.Now;
if (tm.Second < 30)
{
_time = "";
retVal = true;
}
else
{
_time = "事件被触发于 " + DateTime.Now.ToLongTimeString();
}
return retVal;
}
/// <summary>
/// 声明一个当前时间的属性
/// </summary>
public string TimeString
{
get { return _time; }
}
protected void OnAction(object sender, ActionCancelEventArgs ev)
{
if (Action!=null)//如果有人订阅了Action事件
{
Action(sender, ev);//则事件触发
}
}
/// <summary>
/// 通过按钮来激发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnRaise_Click(object sender, EventArgs e)
{
ActionCancelEventArgs cancelEvent = new ActionCancelEventArgs();//生成一个ActionCancelEventArgs的实例
OnAction(this, cancelEvent);//激发事件
if (cancelEvent.Cancel)//如果事件被取消,则显示Message
{
lblInfo.Text = cancelEvent.Message;
}
else//反之显示当前时间
{
lblInfo.Text = this.TimeString;
}
}
}
public class ActionCancelEventArgs: CancelEventArgs
{
string _msg = "";
//定义一个Message属性
public string Message
{
get { return _msg; }
set { _msg = value;}
}
}
}