我有一个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
主要区别在于您在调用基本代码时确定的覆盖.在使用该事件时,您无法控制该事件.在使用事件时,您实质上就是基本代码.
这有时是一个重要的区别,因为如果有事件的消费者,但你需要在被调用之前做好工作,那么你需要覆盖.
在这种情况下 - 可能没有太大的区别.
听取自己的事件的课程有点傻.然而,它是设计师工作的方式,它们被编写为生成事件处理程序赋值而不是自动生成方法覆盖.由于您没有使用设计器并自己编写事件处理程序赋值,因此您绝对应该支持覆盖.你可以做错的少一件事,你不能忘记写作业.
只有您(或其他程序员)从您的MainWindow类派生一个类才真正重要.现在您可以选择如何编写OnClosing()方法:
在base.OnClosing()调用之前添加自定义代码.您允许派生类更改您所做的决定.换句话说,对于这个事件,程序员可以强制e.Cancel回到假.这是正常的方式.
首先调用base.OnClosing(),然后添加自定义代码.这使您牢牢掌控,派生类无法覆盖您的决定.当您的决定最重要时,您可以执行此操作和/或派生类无法正确覆盖您的选择,这可能是因为只有您可以访问私人信息.
不要调用base.OnClosing().这可以防止派生代码完全看到事件.当你彻底改变事件处理时,你会这样做.对于此事件,例如,当您取消关闭时,例如,隐藏窗口.