在WPF控件中取消订阅事件
问题描述:
我有一个自定义控件,一个范围滑块,用在我的一个视图中。在WPF控件中取消订阅事件
的构造是这样的:
EventHandler ReCalculateWidthsHandler;
public RangeSlider()
{
ReCalculateWidthsHandler = OnReCalculateWidths;
DependencyPropertyDescriptor.FromProperty(ActualWidthProperty, typeof(RangeSlider)).
AddValueChanged(this, ReCalculateWidthsHandler);
}
我不知道什么时候/我怎么能unscubscribe该事件处理程序。控件中没有Dispose方法。有没有什么方法可以通知控制权被处置/删除,以便我可以取消订阅任何订阅的事件?
这可能是一个比较普遍的问题:给定一个扩展Control的自定义控件,如何判断它的处置时间?
谢谢。
答
通常,您应该使用OverrideMetadata为依赖项属性添加更改处理程序。不幸的是,它不适用于只读属性。这就是为什么你使用我认为的属性描述符。您知道这种方式太复杂,因为AddValueChanged存储导致内存泄漏的静态强引用。我想你应该从SizeChanged事件中调用ReCalculateWidthsHandler,而不是订阅属性描述符。
如果我将其更改为定期订阅到SizeChanged事件,那么当控件处置时,我将何处取消订阅该事件?如果我不退订,我会不会留下内存泄漏? – Flack 2011-04-14 21:07:57
不会。如果您将处理程序订阅到同一事件的事件,则不会有外部引用。 – 2011-04-14 22:10:29
啊,是的。这下滑了我的想法。假设另一个控件被传递给我的自定义控件,并且我的自定义控件订阅了其中一个事件,如otherControl.SomeEvent + = SomeEventHandler。我的自定义控件何时会取消订阅该事件,以便不引用otherControl? – Flack 2011-04-14 22:30:13