Show()を呼び出して、それClose()自体を許可することにより、別のウィンドウから作成しているWPFウィンドウがあります。ウィンドウが閉じると、ウィンドウが停止し、デストラクタが呼び出され、すべての子要素(タイマーなど)が削除されると思います。
そのようなアクションを呼び出す正しい方法は何ですか?
Close()管理されていないすべてのリソースを解放し、所有されているすべてWindowの を閉じます。
確定的な破棄が必要なその他のマネージド リソースは、 Closedイベントから処理する必要があります。
(注:以前の回答を削除しました。完全に間違った推測でした)
Windows フォームとは異なり、実際に明示的に破棄する必要がある WPF 要素はほとんどありません。
Window の場合、Close() を呼び出すだけで、ドキュメントに従ってすべてのマネージド リソースとアンマネージド リソースを破棄できます。
念のため、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 フレームワークと適切に記述されたコントロールを使用している場合は、問題なく動作するはずです。すべてを解放するだけです。
ドキュメントWindowによると、 が保持するリソースについては次のとおりです。
(強調追加)
ウィンドウを閉じると、Closing イベントが発生します。Closing イベントがキャンセルされない場合、次のことが発生します。
Application.Windows から Window が削除されます (Application オブジェクトが存在する場合)。
所有された Window が表示される前、および所有者 Window が開かれた後に所有者/所有関係が確立された場合、その Window は所有者 Window から削除されます。
Closed イベントが発生します。
Window によって作成されたアンマネージ リソースは破棄されます。
Window を表示するために ShowDialog が呼び出された場合、ShowDialog は戻ります。
順番に並んでいると思います。
タイマーのサブ質問については特にわかりません。質問に実際に答えるのに十分な詳細があるとは思いません。