使用WPF 4.5通用弱事件管理器处理路由事件?

时间:2013-09-02 03:42:47

标签: c# wpf generics routed-events weak-events

我想知道如何将“Handled”RoutedEvents的订阅转换为WeakEventManager?

UIElement有以下方法来订阅“Handled”RoutedEvents: UIElement.AddHandler(RoutedEvent routedEvent,Delegate handler,bool handlingEventsToo)

那么如何将它转换为Generic WeakEventManager表单?

1 个答案:

答案 0 :(得分:2)

您应该只需按照指南创建自定义事件管理器from MSDN,并按照以下方式实施StartListeningStopListening

protected override void StartListening(object source) {
    var sourceElement = (UIElement)source;
    sourceElement.AddHandler(RoutedEvent, OnRoutedEvent, true);
}

protected override void StopListening(object source) {
    var sourceElement = (UIElement)source;
    sourceElement.RemoveHandler(RoutedEvent, OnRoutedEvent, true);
}

我认为使用通用的WeakEventManager没有多大意义,因为它使用事件名称并在内部调用Type.GetEvent,当你使用RoutedEvents时它根本没用。 AddHandler而不是“真实”事件。但是,您可以编写自己的通用基类来处理RoutedEvents。


就个人而言,我使用基于Dustin Campbell's WeakEventHandler的自己的弱事件解决方案。它的优点在于,它不是在内部管理添加和删除,而是为您提供原始委托的“弱”版本,您可以自由传递...因此在添加时无需自定义弱事件管理器的实现代表以不同的方式,因为两种情况下的用法相同:

uielement.MouseDown += weakMouseDownHandler;

uielement.AddHandler(UIElement.MouseDownEvent, weakMouseDownHandler, true);