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


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

В командах 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 интерфейса и его ExecCommandQueryStatusCommand методов.

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

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