使用WPF 4.5用于已处理路由事件的通用弱事件管理器

本文关键字:事件 管理器 路由 处理 WPF 用于 使用 | 更新日期: 2023-09-27 18:29:47

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

UIElement具有以下方法来订阅"Handled"RoutedEvents:UIElement.AddHandler(RoutedEvent RoutedEvent,Delegate handler,bool handledEventsToo)

那么我该如何将其转换为Generic WeakEventManager表单呢?

使用WPF 4.5用于已处理路由事件的通用弱事件管理器

您应该能够按照指南从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的WeakEventHandler的弱事件解决方案。它的好处是,它不是在内部管理添加和删除,而是为您提供了原始委托的"弱"版本,您可以自由传递。。。因此,当以不同的方式添加委托时,没有必要自定义弱事件管理器的实现,因为这两种情况下的用法是相同的:

uielement.MouseDown += weakMouseDownHandler;
uielement.AddHandler(UIElement.MouseDownEvent, weakMouseDownHandler, true);