4
为了减少内存泄漏,我试图找出在向“DataContextChanged”事件或XAML用户控件上的“Loaded”事件添加处理程序之后,即(UserControl.xaml.cs):在XAML用户控件上删除DataContextChanged/Loaded事件处理程序
public MyUserControl()
{
InitializeComponent();
DataContextChanged += new DependencyPropertyChangedEventHandler(MyUserControl_DataContextChanged);
Loaded += new RoutedEventHandler(MyUserControl_Loaded);
}
如果我需要删除它。 WPF是否处理这个问题,还是我需要手动删除它们?
新的RoutedEventHandler()部件创建用户控件外部的对象的新实例。 RoutedEventHandler持有对用户控件的引用(因为这就是事件处理程序所做的),并且用户控件持有对RoutedEventHandler的引用(因为它保留了已注册的所有人的集合)。所以他们互相引用,这意味着两个对象都保持活着。所以我不同意你的发言。 – Nick
@尼克,你的断言是不正确的。 + = RoutedEventHandler不会创建一个持有对该类的引用的新外部对象。如果您不相信这一点,请使用CLR分析器。你会看到上面的模式不会导致一个根源对象。 –
@尼克,请看这里的答案更全面的解释:http://stackoverflow.com/questions/528127/how-built-in-wpf-controls-manage-their-event-handlers-to-an-attached -事件 –