質問
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