2009-09-03 5 views
1

Когда я пытаюсь получить eventinfo из «прямоугольника WPF», если routedEvent является родным событием для объекта (например, «MouseDown»), он работает (например, присвоения) ,GetEvent() возвращает значение null для присоединенного события

DependencyObject d = rectangle; 
string routedEvent = "MouseDown"; 

EventInfo eventInfo = d.GetType().GetEvent(routedEvent, 
       BindingFlags.Public | BindingFlags.Instance); 

Но когда я хочу, чтобы получить EventInfo для вложенного события (я думаю, что я использую этот термин правильно) на прямоугольнике, как:

string routedEvent = "Microsoft.Surface.Presentation.Contacts.ContactDownEvent"; 

GetEvent() возвращает нулевое

Любая идея о том, как получить eventinfo для присоединенного события.

Благодаря

Dan

ответ

3

Вы можете использовать более конкретный EventManager.GetRoutedEventsForOwner метод.

Я считаю, что документы MSDN неверны, когда они говорят:

Базовые классы включены в поиска.

Вот доказательство:

Debug.Assert(EventManager.GetRoutedEventsForOwner(typeof(Rectangle)) == null); 
Debug.Assert(EventManager.GetRoutedEventsForOwner(typeof(Shape)) == null); 
//even though FrameworkElement is a base class of the above! 
Debug.Assert(EventManager.GetRoutedEventsForOwner(typeof(FrameworkElement)) != null); 

Таким образом, вам может понадобиться для обхода иерархии типов самостоятельно, или, если это разовый просто передать в typeof(FrameworkElement) вместо или typeof(Rectangle).

+1

RoutedEvent [] routedEvents = EventManager.GetRoutedEventsForOwner (d.GetType()); возвращает null? Я проверил d.GetType() возвращает прямоугольник. –

+0

Обновлен мой ответ. –

+1

Кент, спасибо за совет. Я чувствую, что приближаюсь. Мой первоначальный запрос состоял в том, чтобы получить объект EventInfo, потому что я хочу добавить обработчик события (через .AddEventHandler). Если я получаю тип RoutedEvent вместо EventInfo (по вашей рекомендации), как добавить обработчик? Спасибо –

0

Поскольку прикрепленные события не отображаются как обычные события C#. В Mouse классе, нет ничего подобного:

public event MouseButtonEventHandler MouseDown; 

Вместо этого есть статическое поле MouseDownEvent типа RoutedEvent:

public static readonly RoutedEvent MouseDownEvent; 

Вы используете EventManager подписаться/отказаться от подписки на события.

 Смежные вопросы

  • Нет связанных вопросов^_^