2011-07-22 24 views
4

为了减少内存泄漏,我试图找出在向“DataContextChanged”事件或XAML用户控件上的“Loaded”事件添加处理程序之后,即(UserControl.xaml.cs):在XAML用户控件上删除DataContextChanged/Loaded事件处理程序

public MyUserControl() 
    { 
     InitializeComponent(); 
     DataContextChanged += new DependencyPropertyChangedEventHandler(MyUserControl_DataContextChanged); 
     Loaded += new RoutedEventHandler(MyUserControl_Loaded); 
    } 

如果我需要删除它。 WPF是否处理这个问题,还是我需要手动删除它们?

回答

5

简答题 - 没有。

你只需要删除处理程序,当他们将保持一个对象的根,这意味着防止其垃圾收集。如果您创建一个子对象,并让其某个事件处理程序指向一个父对象,则不会发生这种情况,因为没有对子对象的悬挂引用。

如果你创建一个子对象和父对象点的事件处理程序到子对象的一个​​,因为现在的父对象涉及到子对象的引用,这将让它活着就会发生(扎根) 。

在上面指定的情况下,它完全是内部的 - 您正在类中添加对您自己的类的引用。当用户控件被销毁时,它不会在其他类的事件处理程序中引用它。所以你不需要删除事件处理程序。

+0

新的RoutedEventHandler()部件创建用户控件外部的对象的新实例。 RoutedEventHandler持有对用户控件的引用(因为这就是事件处理程序所做的),并且用户控件持有对RoutedEventHandler的引用(因为它保留了已注册的所有人的集合)。所以他们互相引用,这意味着两个对象都保持活着。所以我不同意你的发言。 – Nick

+0

@尼克,你的断言是不正确的。 + = RoutedEventHandler不会创建一个持有对该类的引用的新外部对象。如果您不相信这一点,请使用CLR分析器。你会看到上面的模式不会导致一个根源对象。 –

+0

@尼克,请看这里的答案更全面的解释:http://stackoverflow.com/questions/528127/how-built-in-wpf-controls-manage-their-event-handlers-to-an-attached -事件 –