none
ユーザーコントロールのリソース廃棄処理 RRS feed

  • 質問

  • WPFのユーザーコントロールを作成しております。
    このコントロールが所有しているリソースをFinalize前に廃棄したいと思っています。

    このコントロールはXAMLでインスタンス化させています。

    初期化のタイミングはイベントなどで処理できますが、
    ウィンドウが閉じられた後の廃棄処理はどのように
    行えばよいかわかりません。

    WindowsFormsなどにはDisposedイベントがあったのですが、
    同様な処理をどのように実現してよいかわかりません。

    2009年11月1日 14:29

すべての返信

  • 今更な返信で恐縮ですが、IDisposableの実装とusingを使用することで実現できると思います。
    IDisposableは、UserControlとそれを使用しているWindowの両方に実装し、
    UserControlを使用しているWindowを表示させるインスタンスにusingを用います。
    (VB.NETならtry-finallyで代用して下さい)

    例はWindow1からWindow2を起動させ、Window2に廃棄処理をさせたいユーザコントロールが存在する場合です。

    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // usingを用いてWindow2の廃棄処理を実行
            using (var window = new Window2())
            {
                window.ShowDialog();
            }
        }
    }
    
    public partial class Window2 : Window, IDisposable
    {
        public Window2()
        {
            InitializeComponent();
        }
    
        public void Dispose()
        {
            // XAMLで実装させたユーザコントロール(ctrl)の廃棄処理を実行
            ctrl.Dispose();
        }
    }
    
    public partial class UserControl1 : UserControl, IDisposable
    {
        public UserControl1()
        {
            InitializeComponent();
        }
    
        public void Dispose()
        {
            // ユーザコントロールの廃棄処理
        }
    }
    • 回答の候補に設定 えいと 2010年1月7日 15:39
    2010年1月6日 18:39
  • こんにちは、


    ユーザーコントロールを廃棄するために「Unloaded」イベントがあります。

    例:
    public partial class ControlXXX : UserControl {
    
       public ControlXXX() {
            this.Unloaded += new RoutedEventHandler(XXX_Unloaded);
      }
    
      void XXX_Unloaded(object sender, RoutedEventArgs e) {
               
      }
    
    }
    以上です。
    2010年1月13日 3:38
  • FrameworkElement. Unloaded イベント の解説にありますが、アプリケーション終了時には Unloaded が発生しないという仕様に注意してください。
    Application の ShutdownMode を OnExplicitShutdown にしておけばシャットダウン中にならないので回避可能ですが、この場合は明示的に Application.Shutdown を呼び出す必要があります。
    恐らく、UserControl 側のみで完結はできません。
    2010年1月13日 4:12
  • クラスのメンバ変数に入れておくもので,
    本当に漏れては困るような外部リソース(ネイティブ系ハンドル)は,
    Disposeパターンではなく,
    SafeHandleもしくはその自作派生クラスに
    C++でいうところの スマートポインタ のように
    ハンドルを入れておくのが,2.0からの推薦?になってますよね。

    ハンドルでラップするのとイベントの明示的解放での
    タブルで処理するのが無難なんじゃないですかね。
    稍丼 / yayadon
    2010年1月15日 15:30