C# 如何写一个“";预览“-是否键入可以取消主事件的事件?

C# 如何写一个“";预览“-是否键入可以取消主事件的事件?,c#,events,event-handling,C#,Events,Event Handling,假设我有一个活动。我们叫它多斯塔夫。在DoStuff发生之前,我正在尝试使用另一个事件PreviewDoStuff来检查是否需要防止调用DoStuff。我面临的问题是,我无法从PreviewDoStuff中获取任何类型的值,例如返回代码或任何由于事件编写方式而导致的值。事件参数没有传递回调用方,因此我无法获取事件参数的“handled”属性。我相信一定有办法做到这一点,但我不知道怎么做。有什么想法吗 谢谢 将事件声明为EventHandler。然后侦听器可以将Cancel设置为true,您可以使

假设我有一个活动。我们叫它多斯塔夫。在DoStuff发生之前,我正在尝试使用另一个事件PreviewDoStuff来检查是否需要防止调用DoStuff。我面临的问题是,我无法从PreviewDoStuff中获取任何类型的值,例如返回代码或任何由于事件编写方式而导致的值。事件参数没有传递回调用方,因此我无法获取事件参数的“handled”属性。我相信一定有办法做到这一点,但我不知道怎么做。有什么想法吗


谢谢

将事件声明为
EventHandler
。然后侦听器可以将Cancel设置为true,您可以使用该值确定是否引发“real”事件

强制性代码示例:

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);
    }
}
公共事件事件处理程序PreviewDoStuff;
公共事件处理程序DoStuff;
私人空间
{
CancelEventArgs args=新的CancelEventArgs();
OnPreviewDoStuff(args);
如果(!args.Cancel)
{
OnDoStuff(EventArgs.Empty);
}
}
PreviewDostuff上受保护的无效(CancelEventArgs e)
{
EventHandler previewDoStuff=previewDoStuff;
如果(previewDoStuff!=null)
{
previewDoStuff(本,e);
}
}
受保护的无效OnDoStuff(事件参数e)
{
EventHandler doStuff=doStuff;
if(doStuff!=null)
{
多斯塔夫(本,e);
}
}

对于实际使用中的示例,请检查事件,该事件使用FormClosingEventArgs类,该类又从CancelEventArgs继承。

将事件声明为
EventHandler
。然后侦听器可以将Cancel设置为true,您可以使用该值确定是否引发“real”事件

强制性代码示例:

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);
    }
}
公共事件事件处理程序PreviewDoStuff;
公共事件处理程序DoStuff;
私人空间
{
CancelEventArgs args=新的CancelEventArgs();
OnPreviewDoStuff(args);
如果(!args.Cancel)
{
OnDoStuff(EventArgs.Empty);
}
}
PreviewDostuff上受保护的无效(CancelEventArgs e)
{
EventHandler previewDoStuff=previewDoStuff;
如果(previewDoStuff!=null)
{
previewDoStuff(本,e);
}
}
受保护的无效OnDoStuff(事件参数e)
{
EventHandler doStuff=doStuff;
if(doStuff!=null)
{
多斯塔夫(本,e);
}
}

例如,在实际使用中,请检查事件,该事件使用FormClosingEventArgs类,而FormClosingEventArgs类又继承自CancelEventArgs。

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

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

我猜您的意思是希望创建自己的名为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);

我想你的意思是你想创建自己的名为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);