c# - 使用 WPF 4.5 通用弱事件管理器来处理路由事件?

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

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

UIElement 有以下方法来订阅“Handled”RotedEvents: UIElement.AddHandler(RoatedEventroutedEvent,委托(delegate)处理程序,boolhandledEventsToo)

那么如何将其转换为 Generic WeakEventManager 形式?

最佳答案

您应该能够按照创建自定义事件管理器的指南 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);
}

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


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

uielement.MouseDown += weakMouseDownHandler;

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

关于c# - 使用 WPF 4.5 通用弱事件管理器来处理路由事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18565396/

相关文章:

c# - MVVM 中的 Datagrid 绑定(bind)和编辑

c# - 向上转型和通用列表

c# - WPF 触发器/绑定(bind)不起作用

java - java泛型方法的调用

c# - 打开 powerpoint 演示文稿并隐藏窗口

c# - 映射两个相同类型的对象(不包括某些字段)的最佳方法是什么?

wpf - 存储库设计模式指南

c# - 如何在 WPF 中使用 SQLite

java - 泛型调用不同类中的方法,但具有相同的方法签名

java - 在 Java 中实现泛型中的 vs 扩展