вызвать зарегистрированных обработчиков событий на routedevents с отражением в silverlight - PullRequest
4 голосов
/ 16 октября 2010

Я хочу вызвать все зарегистрированные обработчики RoutedEvent FrameworkElement (например, MouseLeftButtonUp или MouseMove ContentControl / Canvas / ...).В моем случае я получил ссылку на этот объект, и я знаю, какое событие должно быть вызвано.Но после нескольких часов размышлений я спрашиваю себя, возможно ли это?Объект не соответствует типу цели. "Так кто-нибудь имеет ключ к этому?

Приветствия Тим

1 Ответ

0 голосов
/ 22 ноября 2012

Это намного проще, чем вы думаете. Чтобы вызвать событие, когда у вас есть объект EventInfo, вы можете просто использовать evtInfo.GetRaiseMethod(true).Invoke(...)

Но причина, по которой ваш код дает сбой, заключается в том, что событие ContentControl.MouseLeftButtonUp использует делегат MouseButtonEventHandler , который ожидает аргумент MouseButtonEventArgs.

Итак, чтобы ваш пример работал, вы можете попробовать следующий код:

var eventInfo = contentControl.GetType().GetEvent("MouseLeftButtonUp", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
var raise = eventInfo.GetRaiseMethod(true);
raise.Invoke(contentControl, new object[] { contentControl, new MouseButtonEventArgs(null, 0, MouseButton.Left) });

Я не уверен, разрешает ли конструктор MouseButtonEventArgs нулевой MouseDevice, иначе вы можете оставить аргумент как нулевой:

raise.Invoke(contentControl, new object[] { contentControl, null });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...