2008-10-31 86 views
11

WPF控件WindowsFormsHost繼承自IDisposable。何時可以處理一次性IDisposable WPF控件WindowsFormsHost?

如果我有一個複雜的WPF可視化樹,其中包含上述某些控件,可以使用什麼事件或方法在關閉期間調用IDispose?

+1

當你說'在關機期間',你的意思是應用程序正在關閉?該控件不再可見?對話框正在關閉? – 2008-11-01 02:56:42

+0

在這裏我的意思是應用程序關閉,但我也對對話結束的情況感興趣。 – morechilli 2008-11-01 17:12:51

回答

4

大廈我想出了由一個窗口主辦,希望在關閉該窗口,以保證處置任何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(); 
        }; 
       } 
      }; 

      ... 

     } 

     ... 
    } 
-1

當關閉表單時,您不需要處理控件,如果控件位於表單的可視化樹中(作爲表單的子表單或表單中的其他控件),API將自動爲您執行此操作,

+0

我的WFH是包含主wpf窗口的樹中另一個WPF控件的子項。在WFH上處理是永遠不會被調用的。 – morechilli 2008-11-01 00:50:01

+0

當在主wpf窗口上調用Dispose時,其所有子項都將被丟棄(依此類推)。你的WFH控制應該在那個時候處理,而不需要你做任何額外的工作。 – 2008-11-02 05:20:49

+4

鑑於wpf應用程序類和wpf窗口類都不會從IDisposable繼承,這看起來不太可能 - 我相信wpf不需要在處理winforms之前進行處理。 – morechilli 2008-11-02 16:48:59

8

在應用程序關閉的情況下,您不需要做任何事情來正確處理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); 
    } 
} 
0

WPF控件不實現IDisposable接口,因爲他們沒有什麼處置(無柄進行清理,沒有非託管內存釋放)。您需要做的只是確保您沒有任何對控件的引用,GC將清除它們。

因此,WPF採用weak event patterns確保控件可以被垃圾收集。這是您需要實施以確保清理的模式,而不是IDisposable。

相關問題