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