2009-02-20 9 views
41

私は別のウィンドウから作成しているWPFウィンドウを持っています(show()ing、次にclose()自体を許可します)。ウィンドウが閉じると、私はそれが死ぬことを期待し、そのコンストラクタを呼び出し、すべての子要素(タイマーなど)を削除します。WPFウィンドウを処分する正しい方法は何ですか?

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

答えて

52

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

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

Reference

(注:前の回答を削除し、それは完全に間違って推測した)

+1

WPFのWindowクラスにはDispose()メソッドがありません! –

+6

おそらく私は最初にドキュメントを読むべきですか? –

11

実際に明示的にWindowsフォームとは異なり、配置する必要がある非常に少数のWPF要素があります。

Windowの場合、Close()を呼び出すだけで、すべての管理対象リソースとアンマネージリソースをdocumentationに割り当てることができます。

+3

私のドキュメントでは、管理されていないリソースだけが廃棄されていると言われています。 –

1

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

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

6

私は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(); 
} 

これは正常に動作します - それは閉鎖されてからウィンドウを防ぐイベントハンドラを削除し、それを閉じます。

+0

子ウィンドウを閉じるときに、まったく同じバグ(閉鎖防止イベントハンドラの登録を忘れてしまいました)私の一日を保存:) – Nipheris

関連する問題