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分配一个值。或者,使用一个通用页面,该页面是根可视化页面,其中包含一个
框架
,在该框架中显示登录名,然后显示通常使用的任何其他内容。