WPF控件WindowsFormsHost繼承自IDisposable。何時可以處理一次性IDisposable WPF控件WindowsFormsHost?
如果我有一個複雜的WPF可視化樹,其中包含上述某些控件,可以使用什麼事件或方法在關閉期間調用IDispose?
WPF控件WindowsFormsHost繼承自IDisposable。何時可以處理一次性IDisposable WPF控件WindowsFormsHost?
如果我有一個複雜的WPF可視化樹,其中包含上述某些控件,可以使用什麼事件或方法在關閉期間調用IDispose?
大廈我想出了由一個窗口主辦,希望在關閉該窗口,以保證處置任何WPF控件這個通用的解決方案。
(顯然,如果你能避免自IDisposable繼承做,但有時你不能)
處置是當在層次結構中的第一個父窗口關閉調用。
(可能的改進 - 改變事件處理使用弱格局)
public partial class MyCustomControl : IDisposable
{
public MyCustomControl() {
InitializeComponent();
Loaded += delegate(object sender, RoutedEventArgs e) {
System.Windows.Window parent_window = Window.GetWindow(this);
if (parent_window != null) {
parent_window.Closed += delegate(object sender2, EventArgs e2) {
Dispose();
};
}
};
...
}
...
}
當關閉表單時,您不需要處理控件,如果控件位於表單的可視化樹中(作爲表單的子表單或表單中的其他控件),API將自動爲您執行此操作,
我的WFH是包含主wpf窗口的樹中另一個WPF控件的子項。在WFH上處理是永遠不會被調用的。 – morechilli 2008-11-01 00:50:01
當在主wpf窗口上調用Dispose時,其所有子項都將被丟棄(依此類推)。你的WFH控制應該在那個時候處理,而不需要你做任何額外的工作。 – 2008-11-02 05:20:49
鑑於wpf應用程序類和wpf窗口類都不會從IDisposable繼承,這看起來不太可能 - 我相信wpf不需要在處理winforms之前進行處理。 – morechilli 2008-11-02 16:48:59
在應用程序關閉的情況下,您不需要做任何事情來正確處理WindowsFormsHost。由於它來自HwndHost,因此在Dispatcher關閉時處理。如果你使用反射器,你會看到當HwndHost被初始化時它會創建一個WeakEventDispatcherShutdown。
如果你在一個對話框中使用它,我建議的最好的方法就是重寫OnClosed並丟棄你的主機,否則HwndHost會一直掛起,直到Dispatcher關閉。
public partial class Dialog : Window
{
public Dialog()
{
InitializeComponent();
}
protected override void OnClosed(EventArgs e)
{
if (host != null)
host.Dispose();
base.OnClosed(e);
}
}
測試dispose何時被調用的一種簡單方法是從WindowsFormsHost派生一個自定義類,並在不同情況下進行調試。放置一個斷點並查看它何時被調用。從託德的回答
public class CustomWindowsFormsHost : WindowsFormsHost
{
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
}
WPF控件不實現IDisposable接口,因爲他們沒有什麼處置(無柄進行清理,沒有非託管內存釋放)。您需要做的只是確保您沒有任何對控件的引用,GC將清除它們。
因此,WPF採用weak event patterns確保控件可以被垃圾收集。這是您需要實施以確保清理的模式,而不是IDisposable。
當你說'在關機期間',你的意思是應用程序正在關閉?該控件不再可見?對話框正在關閉? – 2008-11-01 02:56:42
在這裏我的意思是應用程序關閉,但我也對對話結束的情況感興趣。 – morechilli 2008-11-01 17:12:51