次の方法で共有


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

質問

2009年11月1日日曜日 14:29

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

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

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

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

すべての返信 (4)

2010年1月6日水曜日 18:39

今更な返信で恐縮ですが、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月13日水曜日 3:38

こんにちは、

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

例:

public partial class ControlXXX : UserControl {

   public ControlXXX() {
        this.Unloaded += new RoutedEventHandler(XXX_Unloaded);
  }

  void XXX_Unloaded(object sender, RoutedEventArgs e) {
           
  }

}

以上です。


2010年1月13日水曜日 4:12

FrameworkElement. Unloaded イベント の解説にありますが、アプリケーション終了時には Unloaded が発生しないという仕様に注意してください。
Application の ShutdownMode を OnExplicitShutdown にしておけばシャットダウン中にならないので回避可能ですが、この場合は明示的に Application.Shutdown を呼び出す必要があります。
恐らく、UserControl 側のみで完結はできません。


2010年1月15日金曜日 15:30

クラスのメンバ変数に入れておくもので,
本当に漏れては困るような外部リソース(ネイティブ系ハンドル)は,
Disposeパターンではなく,
SafeHandleもしくはその自作派生クラスに
C++でいうところの スマートポインタ のように
ハンドルを入れておくのが,2.0からの推薦?になってますよね。

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