Как найти все методы, в настоящее время подписанные на событие в WPF / C # во время отладки в Visual Studio - PullRequest
0 голосов
/ 12 ноября 2018

Я довольно новичок в WPF и довольно новичок в C # и теперь унаследовал приложение C # / WPF с более чем 60-тысячными строками кода (MVVM не использовался, шаблон проектирования довольно импровизированный). Теперь я должен изменить довольно небольшую вещь в пользовательском интерфейсе, но этот элемент управления весьма важен и поэтому тесно связан с целым решением. Я знаю функцию "Live Visual Tree" в Visual Studio, а также знаю Live Property Explorer. Тем не менее, я хотел бы иметь что-то вроде «Live EVENT Explorer», чтобы увидеть, какие методы зарегистрированы для события этого элемента управления. Я хотел бы иметь что-то вроде:

a) Возможность увидеть, какие методы в настоящее время подписаны на определенное событие (например, событие SelectionChanged объекта ListView). Под «в настоящее время» я подразумеваю, что подписанные методы меняются довольно сильно в зависимости от того, какие переключатели и флажки выбраны и т. Д. Поэтому я хотел бы сделать все нужные мне выборы, а затем осмотреть элемент управления и посмотреть, какие методы подписался на одно из его событий.

b) Возможность остановиться прямо в первом методе, который запускается этим событием, если я, например, изменил выбор в моем элементе управления. Так что я могу пройти через весь следующий код?

У кого-нибудь из вас есть идея, возможно ли что-либо из этого с помощью встроенной функции в Visual Studio, а также как это сделать? Или, может быть, есть другой инструмент для достижения чего-то подобного?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

В большинстве случаев Find All References должен охватывать это, но это не удается, когда событие не достаточно уникально (представьте Button.Click).

Вы можете получить доступ к этому в отладчике, перейдя к событиюобъекта и изучения поля _invocationList.Если это поле не заполнено, посмотрите на поле _methodPtr.Если оба поля имеют нулевое значение, то никто не подписан.

_target - это объект, содержащий подписанный метод.Если он равен нулю, подписывается статический метод (что делает идентификацию гораздо более сложной ).В противном случае вы можете сбросить таблицу методов целевого объекта, чтобы найти подписанный метод.

В Visual studio всплывающие подсказки облегчают эту задачу.Для одноадресного делегата при наведении курсора на событие отображается декларируемый тип и имя метода (и арность, если необходимо):

screencap showing debugger tooltip

для многоадресной передачи, _invocationList вступает во владение:

screencap showing debugger tooltip

0 голосов
/ 12 ноября 2018

Вы можете перейти к View, где находится ListView, и в выделенном коде подписаться на событие ListView.SelectionChanged и добавить следующий код для обработки события:

foreach(EventHandler subscriber in ListView.SelectionChanged.GetInvocationList())
{
        // etc
}

Вы можете получить больше информации здесь:

Как получить подписчиков на событие?

Надеюсь, это поможет вам немного отладить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...