在WPF中为所有元素事件添加监听器

7
我希望可以一次性钩取所有可用元素事件。类似于这样的方式:
elem.AddHandler(AnyRoutedEvent, (RoutedEventHandler)handler)

我该如何做到这一点?

3个回答

11

尝试这个方法以获取 Button 类型的所有事件...您可以替换为其他类型。

RoutedEvent[] events = EventManager.GetRoutedEventsForOwner(typeof(Button));

foreach (RoutedEvent e in events)
   elem.AddHandler(e, handler);

你也可以使用以下代码来获取所有类型的路由事件,但这会是一个相当长的列表!

RoutedEvent[] events = EventManager.GetRoutedEvents();

1
请注意此代码可能会导致的泄漏。在WPF中添加事件处理程序而不删除它们会导致泄漏。您可以在https://www.jetbrains.com/help/dotmemory/2019.2/Inspections.html#event_handlers_leak上查看更多信息。 - Arash

4
您可以使用EventManager的RegisterClassHandler方法来静态地一次性监听所有元素 :)
EventManager.RegisterClassHandler(typeof(your class), Button.ClickEvent, new RoutedEventHandler(OnButtonClick));

static void OnButtonClick(object sender, RoutedEventArgs e)
{
    //Do awesome stuff with the button click
}

1

我从这篇文章中得到启发:http://geekswithblogs.net/tkokke/archive/2009/07/17/monitoring-routed-events-in-wpf.aspx

    /// <summary>
    /// This is used for debugging, when your looking for a specific event
    /// </summary>
    public static void RegisterAllEvents(Type type, FrameworkElement target)
    {
        var events = EventManager.GetRoutedEvents();
        foreach (var routedEvent in events)
        {
            EventManager.RegisterClassHandler(type,
                                routedEvent, new RoutedEventHandler((sender, args) =>
                {
                    if ( sender != target)
                        return;
                    System.Diagnostics.Debug.WriteLine(args.OriginalSource + "=>" + args.RoutedEvent);
                }));
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接