WPF RoutedCommand/RoutedEvent, кто/что вызывает событие?

Я пытаюсь понять, как WPF реализует маршрутизируемые команды, которые внутри себя реализуются маршрутизируемыми событиями. В определении класса UIElement мы находим этот фрагмент кода:

EventManager.RegisterClassHandler(type, CommandDevice.CommandDeviceEvent, new 
    CommandDeviceEventHandler(UIElement.OnCommandDeviceThunk), false);

С этого момента обработчик UIElement.OnCommandDeviceThunk будет передавать всю информацию через аргументы функций, которые он вызывает в своем теле, которые сами делают то же самое, пока не достигнет события CommandBinding.Executed, на которое мы подписываемся, тем самым выполняя наш ответный код.

Чего я не могу найти и хотел бы понять, так это того, кто поднимает CommandDevice.CommandDeviceEvent?

Когда, например, я связываю свойство Command объекта подкласса ButtonBase с командой ApplicationCommands, поднимает ли оно каким-то образом CommandDeviceEvent и как это происходит?

Я понимаю, что GlobalEventManager содержит множество списков обработчиков событий, но я еще не понял, кто инициирует события для запуска этих обработчиков?


person Quoc-Minh    schedule 17.10.2017    source источник


Ответы (1)


Когда, например, я связываю свойство Command объекта подкласса ButtonBase с командой ApplicationCommands, поднимает ли оно каким-то образом CommandDeviceEvent и как это происходит?

Класс ButtonBase вызывает метод ExecuteCommandSource внутреннего класса CommandHelpers при щелчке по нему: https://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/Controls/Primitives/ButtonBase.cs,c0949dd81fca07f3,references

Затем этот метод выполняет реальную команду, т. е. объект, возвращаемый свойством ICommand: ="nofollow noreferrer">https://referencesource.microsoft.com/#PresentationFramework/Framework/MS/Internal/Commands/CommandHelpers.cs,518e4547841e704d

person mm8    schedule 17.10.2017