5

問題は、WPF ウィンドウが IDisposable インターフェイスを実装していないため、ShowDialog() を呼び出して開いたときに手動で破棄する必要がないことですが、この MSDN ページの最初のコメントには別の記述があります。何が真実か分かる人いますか?

4

2 に答える 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 は役に立ちますか?

いくつかの参考文献と関連記事:

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

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

    /// <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 に答える