为WPF中的所有元素事件添加侦听器

时间:2009-03-11 13:08:18

标签: wpf events hook event-listener

我想在一次调用中挂钩所有可用的元素事件。有点像这样:

elem.AddHandler(AnyRoutedEvent, (RoutedEventHandler)handler)

我该怎么做?

3 个答案:

答案 0 :(得分:9)

尝试此操作以获取Button类型上的所有事件...您可以替换其他类型。

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

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

您还可以替换以下内容来获取所有类型的所有路由事件,但这可能是一个列表!

RoutedEvent[] events = EventManager.GetRoutedEvents();

答案 1 :(得分:2)

您可以使用Event Manager的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
}

答案 2 :(得分: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);
                }));
        }
    }