如何阻止可以取消的事件?


3

请帮助我实现一个事件,该处理程序可以取消它。

public class BuildStartEventArgs : EventArgs 
{ 
    public bool Cancel { get; set; } 
} 

class Foo 
{ 
    public event EventHandler<BuildStartEventArgs> BuildStart; 

    private void Bar() 
    { 
     // build started 
     OnBuildStart(new BuildStartEventArgs()); 
     // how to catch cancellation? 
    } 

    private void OnBuildStart(BuildStartEventArgs e) 
    { 
     if (this.BuildStart != null) 
     { 
      this.BuildStart(this, e); 
     } 
    } 
} 
  0

为什么不使用已经存在的System.CancelEventArgs类? 22 2月. 092009-02-22 12:42:39

  0

顺便说一句,这是System.ComponentModel.CancelEventArgs :) 22 2月. 092009-02-22 13:04:14

5

您需要修改这个代码:

private void Bar() 
{ 
    // build started 
    OnBuildStart(new BuildStartEventArgs()); 
    // how to catch cancellation? 
} 

来是这样的:有引用语义

private void Bar() 
{ 
    var e = new BuildStartEventArgs(); 
    OnBuildStart(e); 
    if (!e.Cancel) { 
     // Do build 
    } 
} 

类在.NET中,所以你可以看到对所做的任何更改对象事件引用的参数。

  0

谢谢!我认为这会更困难 22 2月. 092009-02-22 12:51:00

+1

不是所有的编程都很困难......它看起来就像这样:-) 22 2月. 092009-02-22 13:19:28


1

BuildStartEventArgs类有一个布尔型取消属性。 让事件处理程序能够标记这个。

private void Bar() 
{ 
    // build started 
    var args = new BuildStartEventArgs(); 
    OnBuildStart(args); 
    if (args.Cancel) 
    { 
    // cancel 
    } 

} 
  0

在问题的例子中,BuildStartEventArgs类已经有一个布尔型的Cancel属性。 22 2月. 092009-02-22 12:41:59

  0

值得投降? 22 2月. 092009-02-22 12:45:04


1

BuildStartEventArgs是多余的,框架已经提供了CancelEventArgs类 - 考虑使用它。

  0

感谢您的提示。但是我的班有其他的属性,我只是没有写在这里。 22 2月. 092009-02-22 12:44:27

+2

但是你可以从CancelEventArgs继承! 22 2月. 092009-02-22 12:58:40