1
protected override void OnClosing(CancelEventArgs e)
{
    base.OnClosing(e); // here?

    if (cancelCondition)
    {
        base.OnClosing(e); // or here?
        e.Cancel = true;
        base.OnClosing(e); // or here?
    }

    base.OnClosing(e); // or here?
}

我尝试了几个不同的地方,它似乎在任何地方都可以工作,只是想知道它是否重要。base.OnClosing(e);实际上有什么作用吗?

4

2 回答 2

4

来自MSDN

从 Window 派生的类型可能会覆盖 OnClosing。如果需要引发 Closing,则重写的方法必须在基类上调用 OnClosing

在您的情况下,似乎不需要实际引发Closing事件,因此您是否以及在何处调用base.OnClosing.


但是,如果您不覆盖该OnClosing方法,则可以避免首先决定这一点,而只需添加一个Closing处理程序:

<Window ... Closing="Window_Closing">
    ...
</Window>

private void Window_Closing(object sender, CancelEventArgs e)
{
    if (cancelCondition)
    {
        e.Cancel = true;
    }
}
于 2013-11-14T19:03:35.280 回答
0

OnClosing如果要更改关闭事件的触发方式,则 应该覆盖。

  1. 如果您想在表单关闭时执行代码并让它在任何其他Closing处理程序之前运行,请将您的其他代码放在base.OnClosing.

  2. 如果您有要在所有其他处理程序运行后运行的代码,请将该代码放在调用base.OnClosing.

  3. 如果您只想有条件地运行所有其他处理程序,请将其base.OnClosing放在某种条件块内,以便仅在您希望运行其他处理程序时调用它。

在所有情况下,对于它属于哪里,没有一个正确的答案。你应该把它放在你想要运行“所有其他事件处理程序”的任何地方,相对于你添加的任何代码。

于 2013-11-14T19:11:50.213 回答