2010-09-08 221 views
1

我動態創建UserControls使用反射: UserControl myConmtrol =(UserControl)Activator.CreateInstance(t);刪除/殺死/刪除UserControl及其事件處理程序

UserControl可能會處理關閉事件,但我不知道處理程序的名稱。

當託管UserControl的窗口關閉時,我將UserControl從其父窗口中刪除,並從窗口中消失:似乎一切正常。

但是,如果我再次打開和關閉UserControl,我可以在調試器中看到Closing事件被兩次處理,一次由當前UserControl處理,另一次由前一個仍處於活動狀態的UserControl處理。

理論上不再引用的UserControl應該是GarbageCollected。 我如何強制它被殺/刪除/處置?至少有沒有辦法禁止它處理事件?

感謝

回答

0

任何事件處理程序,我不得不應付的WinForms同樣的情況在那裏我動態地創建一個用戶控件在另一個用戶控件(比如「HostControl」中的「DynControl」)。

「HostControl」中沒有關閉事件。所以我用HostControl的Disposed事件釋放資源:

this.Disposed += (s, e1) => 
{ 
    DynControl.Click -= += new EventHandler(MyClickHandler); 
    this.Controls.Remove(DynControl); 
    DynControl.Dispose(); 
}; 
+0

謝謝。但沒有WPF UserControl的Dispose方法... – qay 2010-09-08 12:51:29

0

回答不知道他們的名字刪除處理程序:

public void RemoveHandlerOfUserControl(UserControl uc) 
{ 

    MulticastDelegate dlg = MyEvent; 
    Delegate[] handlers = dlg.GetInvocationList(); 
    foreach (Delegate d in handlers) 
    { 
     if (d.Target == uc) 
     { 
      this.RemoveHandler(MyEvent, d); 
     } 
    } 
} 

這種方法必須駐留在聲明該事件的對象。