Поделиться через


Алгоритм маршрутизации команд

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

Порядок обработки команд

Команды передаются через следующие уровни контекста команды:

  1. Надстройки: среда сначала предлагает команду для любых надстроек, присутствующих.

  2. Команды приоритета: эти команды регистрируются с помощью IVsRegisterPriorityCommandTarget. Они вызываются для каждой команды в Visual Studio и вызываются в том порядке, в котором они были зарегистрированы.

  3. Команды контекстного меню: команда, расположенная в контекстном меню, сначала предлагается целевому объекту команды, который предоставляется в контекстном меню, и после этого к стандартной маршрутизации.

  4. Целевые объекты набора команд панели инструментов: эти целевые объекты команд регистрируются при вызове SetupToolbar2. Параметр pCmdTarget может быть null. Если это не null, тогда этот объект команды используется для обновления любых команд, расположенных на панели инструментов, которую вы настраиваете. Если оболочка настраивает панель инструментов, она передает фрейм окна как pCmdTarget, чтобы все обновления команд на вашей панели инструментов осуществлялись через фрейм окна, даже если он не в фокусе.

  5. Окно инструментов: окна инструментов, которые обычно реализуют IVsWindowPane интерфейс, также должны реализовать IOleCommandTarget интерфейс, чтобы Visual Studio смог получить целевой объект команды, когда окно инструмента является активным окном. Однако если окно инструментов с фокусом является окном Project , команда направляется в IVsUIHierarchy интерфейс, который является общим родительским элементом выбранных элементов. Если этот выбор охватывает несколько проектов, команда направляется в иерархию IVsSolution . Интерфейс IVsUIHierarchy содержит методы QueryStatusCommand и ExecCommand, которые аналогичны соответствующим командам на интерфейсе IOleCommandTarget.

  6. Окно документа: если команда имеет установленный RouteToDocs флаг в своем .vsct-файле, то Visual Studio ищет целевой объект команды в объекте представления документа, который является экземпляром интерфейса IVsWindowPane или экземпляром объекта документа (обычно это интерфейс IVsTextLines или интерфейс IVsTextBuffer). Если объект представления документов не поддерживает команду, Visual Studio направляет команду в IOleCommandTarget возвращенный интерфейс. (Это необязательный интерфейс для объектов данных документа.)

  7. Текущая иерархия: текущая иерархия может быть проектом, который владеет активным окном документа или иерархией, выбранной в обозревателе решений. Visual Studio ищет интерфейс IOleCommandTarget, реализованный в текущей или активной иерархии. Иерархия должна поддерживать команды, которые действуют всякий раз, когда она активна, даже если фокус находится в окне документа элемента проекта. Однако команды, которые применяются только в том случае, если менеджер решений имеет фокус, должны поддерживаться с помощью IVsUIHierarchy интерфейса и его QueryStatusCommandExecCommand методов.

    Команды "Вырезать", "Копировать", "Вставка", "Удалить", "Переименовать", "Ввод" и "DoubleClick" требуют специальной обработки. Сведения об обработке команд удаления и удаления в иерархиях см. в интерфейсе IVsHierarchyDeleteHandler .

  8. Global: если команда не была обработана ранее упомянутыми контекстами, Visual Studio пытается перенаправить ее в VSPackage, которая владеет командой, реализующей IOleCommandTarget интерфейс. Если VSPackage еще не загружен, он не загружается при вызове QueryStatus метода Visual Studio. VSPackage загружается только при вызове Exec метода.