如何编写可以取消主事件的"预览"类型事件?

djc*_*uch 1 c# events event-handling

假设我有一个活动.我们称之为DoStuff.在DoStuff发生之前,我正在尝试使用另一个事件PreviewDoStuff来检查是否需要阻止调用DoStuff.我面临的问题是我无法从PreviewDoStuff中获得任何价值,如返回代码或由于事件的编写方式.并且事件args不会传递回调用者,因此我无法获得事件args"处理"属性.我确信必须有办法,但我不知道如何做.有任何想法吗?

谢谢!

Fre*_*örk 5

将事件声明为EventHandler<CancelEventArgs>.然后,侦听器可以将Cancel设置为true,您可以使用该值来确定是否引发"真实"事件.

强制代码示例:

public event EventHandler<CancelEventArgs> PreviewDoStuff;
public event EventHandler DoStuff;

private void RaiseDoStuff()
{
    CancelEventArgs args = new CancelEventArgs();
    OnPreviewDoStuff(args);
    if (!args.Cancel)
    {
        OnDoStuff(EventArgs.Empty);
    }
}

protected void OnPreviewDoStuff(CancelEventArgs e)
{
    EventHandler<CancelEventArgs> previewDoStuff = PreviewDoStuff;
    if (previewDoStuff != null)
    {
        previewDoStuff(this, e);
    }
}

protected void OnDoStuff(EventArgs e)
{
    EventHandler doStuff = DoStuff;
    if (doStuff != null)
    {
        doStuff(this, e);
    }
}
Run Code Online (Sandbox Code Playgroud)

有关实际使用中的此示例,请检查FormClosing事件,该事件使用FormClosingEventArgs类,该类继承自CancelEventArgs.