Добавить прослушиватель для всех событий элемента в WPF

Я хотел бы перехватить все доступные события элемента за один вызов. Что-то вроде этого:

elem.AddHandler(AnyRoutedEvent, (RoutedEventHandler)handler)

Как я могу это сделать?


person alex2k8    schedule 11.03.2009    source источник


Ответы (3)


Попробуйте это, чтобы получить все события типа Button... Вы можете заменить другой тип.

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

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

Вы также можете заменить следующее, чтобы получить ВСЕ перенаправленные события для ВСЕХ типов, но это будет довольно большой список!

RoutedEvent[] events = EventManager.GetRoutedEvents();
person Josh G    schedule 11.03.2009
comment
Будьте осторожны с утечками, которые может вызвать этот код. Добавление обработчиков событий без их удаления создает утечки в WPF. Дополнительную информацию можно найти на странице jetbrains.com/help/dotmemory/2019.2/. - person Arash; 09.11.2019

Вы можете использовать метод RegisterClassHandler EventManager для статического прослушивания всех элементов одновременно :)

EventManager.RegisterClassHandler(typeof(your class), Button.ClickEvent, new RoutedEventHandler(OnButtonClick));

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

Я создал это, вдохновленный: 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);
                }));
        }
    }
person RJ Thompson    schedule 18.09.2017