0

在 .NET 中,通常有一种模式使用属性来使用事件来允许取消事件。例如,这里的一个例子

    private void OtherInitialize() {
       this.Closing += new CancelEventHandler(this.Form1_Closing);
    }

    private void Form1_Closing(Object sender, CancelEventArgs e) {
       if (!isDataSaved) {
          e.Cancel = true;
          MessageBox.Show("You must save first.");
       }
       else {
          e.Cancel = false;
          MessageBox.Show("Goodbye.");
       }
    }

是否有此模式的名称,或任何描述如何实现此模式的文章(从视图的角度来看)?我能想象的是这样的

CancelEventArgs args = new CancelEventArgs();
if(Closing != null)
    Closing(this, args);
if(!args.Cancel)
    DoActualClosing();

但我不确定这是否这么容易。如果有多个事件处理程序,哪个处理程序将确定 args.Cancel 的最终值?如果任何(或所有)处理程序抛出异常怎么办?

4

1 回答 1

0

如果有多个事件处理程序,哪个处理程序将确定 args.Cancel 的最终值?

依次调用每个处理程序,并且可以修改 args.Cancel。

目前它们是按照添加的顺序执行的,但我相信这是一个无法保证的实现细节。

所以,最后一个赢了。通常 Cancel 事件处理程序只设置 arg.Cancel = true (从不将其重置为 false),以便任何事件处理程序都可以取消操作。但是没有什么可以阻止事件处理程序忽略该约定。

如果任何(或所有)处理程序抛出异常怎么办?

然后,除非您处理它,否则您的应用程序将因未处理的异常而崩溃。

您想象的实现看起来是正确的(它不是线程安全的,但 UI 事件通常只在 UI 线程上处理)。我不知道这种模式的名称。

于 2012-11-29T08:44:21.823 回答