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

时间:2009-06-09 22:15:47

标签: c# events event-handling

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

谢谢!

3 个答案:

答案 0 :(得分: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);
    }
}

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

答案 1 :(得分:0)

让您的PreviewDoStuff设置一个内部标志,DoStuff会在其触发时进行检查。更好的是,让引发DoStuff的代码在引发事件之前检查标志。

答案 2 :(得分:0)

我认为你的意思是你想要创建一个名为DoStuff的事件。我认为可以传递“ref”参数:

public delegate void PreviewDoStuffFunc(ref bool Handled);
public event PreviewDoStuffFunc PreviewDoStuff;

但标准方法是使用像CancelEventArgs:

这样的东西
public event CancelEventArgs PreviewDoStuff;
public event EventArgs DoStuff;

然后在触发预览事件后,检查取消:

var e = new CancelEventArgs();    
if (PreviewDoStuff != null)
    PreviewDoStuff(this, e);
if (!e.Cancel)
    DoStuff(this, EventArgs.Empty);