web-dev-qa-db-ja.com

WPFウィンドウを処分する正しい方法は何ですか?

Show()を呼び出して別のウィンドウから作成し、それをClose()自体にするWPFウィンドウがあります。ウィンドウが閉じると、ウィンドウが消滅し、デストラクタが呼び出され、すべての子要素(タイマーなど)が削除されることが予想されます。

そのようなアクションを呼び出す正しい方法は何ですか?

50
vanja.

Close()はすべてのアンマネージリソースを解放し、所有しているすべてのWindowsを閉じます。

確定的な廃棄が必要なその他の管理対象リソースは、 Closed イベントから処理する必要があります。

参照

(注:以前の回答を削除しました。完全に間違った推測でした)

64
Simon Buchan

Windowsフォームとは異なり、実際に明示的に破棄する必要があるWPF要素はほとんどありません。

Windowの場合、Close()を呼び出すだけで、すべてのマネージリソースとアンマネージリソースを documentation に従って破棄できます。

13
Samuel Jack

念のため、2セントを加算します。

私の問題は、十分なトラブルシューティングを行わなかったことです。私のウィンドウは、開いたり、閉じたり、再度開いたりできる子ウィンドウだったので、次を追加して完全に閉じないようにしました。

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
  e.Cancel = true;
  this.Hide();
}

ただし、Window.Closeが呼び出されると、ウィンドウのみが非表示になります。私は最終的に次のものを見つけて追加しました:

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) {
  e.Cancel = true;
  this.Hide();
}

public void Close() {
  this.Closing -= Window_Closing;
  //Add closing logic here.
  base.Close();
}

これは正常に動作します-ウィンドウが閉じられないようにするイベントハンドラーを削除してから閉じます。

10
rookie1024

ウィンドウを閉じて、すべてのリソースをそのウィンドウとその子に解放したことを確信すると、ロジックツリー内のすべての適切に動作する要素がガベージコレクションされます。

「正常に動作している」と言うのは、理論的には適切に停止されないスレッドを作成するような要素を持つことができるからですが、実際には基本的なWPFフレームワークと適切に作成されたコントロールを使用している場合、すべてを解放するだけです。

1
Drew Noakes