Show()
を呼び出して別のウィンドウから作成し、それをClose()
自体にするWPFウィンドウがあります。ウィンドウが閉じると、ウィンドウが消滅し、デストラクタが呼び出され、すべての子要素(タイマーなど)が削除されることが予想されます。
そのようなアクションを呼び出す正しい方法は何ですか?
Windowsフォームとは異なり、実際に明示的に破棄する必要があるWPF要素はほとんどありません。
Windowの場合、Close()を呼び出すだけで、すべてのマネージリソースとアンマネージリソースを documentation に従って破棄できます。
念のため、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();
}
これは正常に動作します-ウィンドウが閉じられないようにするイベントハンドラーを削除してから閉じます。
ウィンドウを閉じて、すべてのリソースをそのウィンドウとその子に解放したことを確信すると、ロジックツリー内のすべての適切に動作する要素がガベージコレクションされます。
「正常に動作している」と言うのは、理論的には適切に停止されないスレッドを作成するような要素を持つことができるからですが、実際には基本的なWPFフレームワークと適切に作成されたコントロールを使用している場合、すべてを解放するだけです。