1. ホーム
  2. c#

[解決済み] WPFユーザーコントロールの破棄

2022-07-23 13:06:26

質問

私は、サードパーティによって使用されることを意図しているカスタム WPF ユーザー コントロールを作成しました。私のコントロールは、使い捨てのプライベート メンバーを持っており、そのウィンドウ/アプリケーションが閉じられると、その dispose メソッドが常に呼び出されるようにしたいと思います。しかし、UserControl は使い捨てではありません。

IDisposable インターフェイスを実装し、Unloaded イベントを購読してみましたが、どちらもホスト アプリケーションが閉じたときに呼び出されません。MSDN は、Unloaded イベントがまったく発生しないかもしれないと述べています。また、ユーザーがテーマを変更した場合など、複数回トリガーされることがあります。

可能な限り、私のコントロールの消費者が特定の Dispose メソッドを呼び出すことを覚えていることに依存したくありません。

 public partial class MyWpfControl : UserControl
 {
     SomeDisposableObject x;

     // where does this code go?
     void Somewhere() 
     {
         if (x != null)
         {
             x.Dispose();
             x = null;
         }

     }
 }

私がこれまでに見つけた唯一の解決策は、Dispatcher の ShutdownStarted イベントを購読することです。これは妥当な方法でしょうか?

this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;

どのように解決するのですか?

興味深いブログ記事はこちらです。 WPFのUserControlを破棄する(ish)

にサブスクライブすることに言及しています。 ディスパッチャー.ShutdownStarted を購読してリソースを廃棄することを述べています。