C# 是否将添加的处理程序删除到单独的控件?

C# 是否将添加的处理程序删除到单独的控件?,c#,.net,silverlight,events,C#,.net,Silverlight,Events,我有一个按钮控件,它需要向其根添加一个处理程序: Application.Current.RootVisual.AddHandler( UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler( RootClicked ), true ); 问题是,当我这样做时,rootVisualUIElement不会因为创建引用而破坏自己 有没有一种方法可以让我检查RootVisual何时不再可见,这样我就可以取消对绑定到它的

我有一个按钮控件,它需要向其根添加一个处理程序:

     Application.Current.RootVisual.AddHandler( UIElement.MouseLeftButtonDownEvent, new MouseButtonEventHandler( RootClicked ), true );
问题是,当我这样做时,rootVisualUIElement不会因为创建引用而破坏自己

有没有一种方法可以让我检查RootVisual何时不再可见,这样我就可以取消对绑定到它的事件的引用,或者至少以其他方式动态删除句柄

我曾尝试研究弱事件,但silverlight中不存在实现该事件的类

通过Weakreferences,我尝试了以下方法:

 m_clickEventHandler = new MouseButtonEventHandler( RootClicked );
 m_weakRefToRoot = new WeakReference( Application.Current.RootVisual );
 ( m_weakRefToRoot.Target as UIElement ).AddHandler( UIElement.MouseLeftButtonDownEvent, m_clickEventHandler, true );

WeakReference在Silverlight 3,4中提供。 应该是你问题的解决方案


另外,我还不知道silverlight 3.5

不要尝试在软引用上胡闹,这是一件很难做到正确的事情。tam在正确的轨道上,使用卸载事件。True
UIElement
没有这样的事件,但您的登录页面最终将从
FrameworkElement
派生。因此:-

 Delegate clickedHandler = new MouseButtonEventHandler( RootClicked );
 FrameworkElement root = (FrameworkElement)Application.Current.RootVisual;
 RootedEventHandler unloadHandler = null;
 unloadHandler = (s, args) =>
 {
      root.Unloaded -= unloadHandler;
      root.RemoveHandler(UIElement.MouseLeftButtonDownEvent, clickedHandler);
 };

 root.AddHandler( UIElement.MouseLeftButtonDownEvent, clickedHandler , true );
 root.Unloaded += unloadHandler;

在什么情况下根可视文件可能不可见。在程序运行之后,它仍然没有释放内存吗?根可视化是一个登录页面,一旦用户登录到登录页面,它就应该被删除,除非我已经向它添加了处理程序,否则它将被删除。因此,我需要一种方法来删除处理程序,以便GC知道如何回收登录页。您是否尝试在卸载事件中取消订阅句柄?卸载事件的名称是什么?UIElement中没有卸载。我正在使用silverlight 3.5,其中卸载的我认为只有4.0。我已经尝试使用weakreferences,但要么我做得不对,要么这不是我的问题…我被困在silverlight 3.0中,不幸的是没有卸载事件…@meds:在这种情况下,你需要任何代码的帮助也就是重新为RootVisual分配一个值。或者,使用一个通用页面,该页面是根可视化页面,其中包含一个
框架
,在该框架中显示登录名,然后显示通常使用的任何其他内容。