問題は、WPF ウィンドウが IDisposable インターフェイスを実装していないため、ShowDialog() を呼び出して開いたときに手動で破棄する必要がないことですが、この MSDN ページの最初のコメントには別の記述があります。何が真実か分かる人いますか?
5320 次
2 に答える
6
ShowDialog() の代わりに Show() を使用してウィンドウを開いた場合のみ。
ドキュメントから:
ShowDialog を呼び出すことによって開かれ、IsCancel プロパティが true に設定された Button を使用してウィンドウが開かれた場合、ボタンがクリックされるか、ESC が押されると、自動的に閉じます。ただし、Show を使用してウィンドウを開いた場合は、Button の Click イベント ハンドラーなどから、Close を明示的に呼び出す必要があります。
と:
ウィンドウを閉じると、Closing イベントが発生します。Closing イベントがキャンセルされない場合、次のことが発生します。
- Application.Windows から Window が削除されます (Application オブジェクトが存在する場合)。
- 所有された Window が表示される前、および所有者 Window が開かれた後に所有者/所有関係が確立された場合、その Window は所有者 Window から削除されます。
- Closed イベントが発生します。
- Window によって作成されたアンマネージ リソースは破棄されます。
- Window を表示するために ShowDialog が呼び出された場合、ShowDialog は戻ります。
于 2010-02-12T12:36:31.767 に答える
0
以下のコードはどうですか?フォームに IDisposable を実装し、すべてのイベント ハンドラーを削除します。ただし、マイクロソフトは既に Close() でそれを行っていますか?
また、手動 GC.Collect は役に立ちますか?
いくつかの参考文献と関連記事:
/// <summary>
/// Interaction logic for MyForm.xaml
/// </summary>
public partial class MyForm: IDisposable
{
public MyForm()
{}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
Dispose();
}
public void Dispose()
{
try{
_resourcescollection.Clear();
_resourcescoll = null;
//close other resources
}
catch(exception ex)
{}
EventHelper.RemoveAllEventHandlers(_resources);
EventHelper.RemoveAllEventHandlers(_timer);
EventHelper.RemoveAllEventHandlers(_etc);
EventHelper.RemoveAllEventHandlers(this);
}
~MyForm()
{
Dispose();
}
}
于 2013-08-02T05:53:33.297 に答える