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 に答える