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

use*_*861 14 .net c# 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mik*_*oud 15

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

这有时是一个重要的区别,因为如果有事件的消费者,但你需要在被调用之前做好工作,那么你需要覆盖.

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


Han*_*ant 8

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

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

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

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

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

  • 我想知道为什么Window类没有可覆盖的OnLoaded方法.如果我想在加载Window时运行一些代码,我必须使用Loaded事件,即使这意味着我的类正在监听自己.我不能总是把这段代码放在构造函数中,因为构造函数每个实例只发生一次,而Load事件发生了零次或多次. (3认同)