我应该使用Closing事件还是覆盖OnClosing?

时间:2014-01-06 16:05:34

标签: c# .net wpf

我有一个WPF项目,其中我有一个带有自定义关闭逻辑的窗口。我想在用户关闭窗口时运行一些代码。我知道有两种方法可以做到这一点,我想知道哪个更好:

选项1)处理base.Closing事件。

选项2)覆盖OnClosing方法。

以下是一些示例代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        base.Closing += this.MainWindow_Closing;
    }

    //Option 1
    void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        //close logic here, or
    }

    //Option 2
    protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
    {
        //close logic here

        base.OnClosing(e);
    }
}

我可以在两个选项之间找到的唯一区别是化妆品。我更喜欢Option 2,因为它对我来说看起来更干净。我更喜欢重写方法来处理事件。

这两个选项之间是否还有其他差异?我知道为其他一些类提供了选项1来处理这个窗口的Closing事件。

编辑:我忘了提到我正在使用.Net 4.0。看起来.Net 4.5有一个OnFormClosing事件,它不赞成OnClosing事件。我没有使用过OnFormClosing事件。

3 个答案:

答案 0 :(得分:15)

主要区别在于您在调用基本代码时确定的覆盖。在使用该事件时,您无法控制该事件。在使用该事件时,您实质上就是基本代码。

这有时是一个重要的区别,因为如果有活动的消费者,但你需要在被叫之前做好工作,那么你需要覆盖。

在这种情况下 - 可能没有太大的区别。

答案 1 :(得分:8)

一个听自己的事件的类有点傻。然而,它是设计师工作的方式,它们被编写为生成事件处理程序赋值而不是自动生成方法覆盖。由于您没有使用设计器并自己编写事件处理程序赋值,因此您绝对应该支持覆盖。你做错了一件事,你不能忘记写作业。

只有您(或其他程序员)从您的MainWindow类派生类才真正重要。现在您可以选择如何编写OnClosing()方法:

  • 在 base.OnClosing()调用之前添加自定义代码。您允许派生类更改您所做的决定。换句话说,对于这个事件,程序员可以强制e.Cancel回到 false 。这是正常的方式。

  • 首先调用base.OnClosing(),然后添加自定义代码。这使您牢牢掌控,派生类无法覆盖您的决定。当您的决定最重要时和/或派生类无法正确覆盖您的选择时,您可以执行此操作,这可能是因为只有您可以访问私人信息。

  • 不调用base.OnClosing()。这可以防止派生代码完全看到事件。当你彻底改变事件处理时,你会这样做。对于此事件,例如,当您取消关闭时,例如,隐藏窗口。

答案 2 :(得分:-1)

当您覆盖OnClosing时,您可以使用CancelEventArgs实现取消关闭的逻辑(请参阅MSDN)。另请参阅an example

如果发生事件,您只需在关闭窗口之前完成一些工作,就不会影响结束过程。