2010-09-08 220 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); 
     } 
    } 
} 

这种方法必须驻留在声明该事件的对象。