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


Предоставление доступа к командам

При добавлении нескольких VSPackage в Visual Studio пользовательский интерфейс может быть переполнен командами. Вы можете запрограммировать пакет, чтобы уменьшить эту проблему, как показано ниже.

  • Программируют пакет таким образом, чтобы он загружался только в том случае, если пользователю требуется его.

  • Программирует пакет таким образом, чтобы его команды отображались только в том случае, если они могут потребоваться в контексте текущего состояния интегрированной среды разработки (IDE).

Задержка загрузки

Типичным способом включения отложенной загрузки является проектирование VSPackage, чтобы его команды отображались в пользовательском интерфейсе, но сам пакет не загружается, пока пользователь не щелкает одну из команд. Для этого в VSCT-файле создайте команды без флагов команд.

В следующем примере показано определение команды меню из VSCT-файла. Это команда, созданная шаблоном пакета Visual Studio при выборе параметра меню в шаблоне.

<Button guid="guidTopLevelMenuCmdSet" id="cmdidTestCommand" priority="0x0100" type="Button">
  <Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPic1" />
  <Strings>
    <CommandName>cmdidTestCommand</CommandName>
    <ButtonText>Test Command</ButtonText>
  </Strings>
</Button>

В примере, если родительская группа, MyMenuGroupявляется дочерним элементом меню верхнего уровня, например меню "Сервис ", команда будет видна в этом меню, но пакет, который выполняет команду, не будет загружен, пока команда не будет щелкнуть пользователя. Однако путем программирования команды для реализации IOleCommandTarget интерфейса можно включить загрузку пакета при первом развертывании меню, содержащего команду.

Обратите внимание, что задержка загрузки также может повысить производительность запуска.

Текущий контекст и видимость команд

Вы можете программировать команды VSPackage, которые будут видимы или скрыты, в зависимости от текущего состояния данных VSPackage или действий, которые в настоящее время актуальны. Вы можете включить VSPackage, чтобы задать состояние своих команд, как правило, с помощью реализации QueryStatus метода из IOleCommandTarget интерфейса, но это требует загрузки VSPackage, прежде чем он сможет выполнить код. Вместо этого рекомендуется включить интегрированную среду разработки для управления видимостью команд без загрузки пакета. Для этого в VSCT-файле свяжите команды с одним или несколькими специальными контекстами пользовательского интерфейса. Эти контексты пользовательского интерфейса определяются ИДЕНТИФИКАТОРом GUID, известным как GUID контекста команды.

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

Тип контекста Description
Активный тип проекта Для большинства типов проектов это GUID значение совпадает с ИДЕНТИФИКАТОРом GUID VSPackage, реализующего проект. Однако проекты Visual C++ используют тип GUID проекта в качестве значения.
Активное окно Как правило, это последнее активное окно документа, которое устанавливает текущий контекст пользовательского интерфейса для ключевых привязок. Однако это также может быть окно инструментов с таблицей привязки ключей, которая напоминает внутренний веб-браузер. Для окон документов с несколькими вкладками, таких как редактор HTML, каждая вкладка имеет другой контекст GUIDкоманды.
Активная языковая служба Языковая служба, связанная с файлом, который в настоящее время отображается в текстовом редакторе.
Окно "Активный инструмент" Открытое окно инструментов и фокус.

Пятая основная область контекста — это состояние пользовательского интерфейса интегрированной среды разработки. Контексты пользовательского интерфейса определяются активным контекстом GUIDкоманды следующим образом:

Эти идентификаторы GUID помечены как активные или неактивные в зависимости от текущего состояния интегрированной среды разработки. Одновременно несколько контекстов пользовательского интерфейса могут быть активными.

Скрытие и отображение команд на основе контекста

Вы можете отобразить или скрыть команду пакета в интегрированной среде разработки без загрузки самого пакета. Для этого определите команду в VSCT-файле пакета с помощью DefaultDisabledDefaultInvisibleDynamicVisibility флагов команд и добавления одного или нескольких элементов VisibilityItem в раздел VisibilityConstraints. Когда указанный контекст GUID команды становится активным, команда отображается без загрузки пакета.

Пользовательские идентификаторы GUID контекста

Если соответствующий GUID контекста команды еще не определен, вы можете определить его в VSPackage, а затем запрограммировать его, чтобы быть активным или неактивным, как это необходимо для управления видимостью команд. Используйте службу для SVsShellMonitorSelection :

  • Зарегистрируйте идентификаторы GUID контекста GetCmdUIContextCookie (вызывая метод).

  • Получение состояния контекста GUID (путем вызова IsCmdUIContextActive метода).

  • Включите и отключите контекст GUID(вызывая SetCmdUIContext метод).

    Внимание

    Убедитесь, что VSPackage не влияет на состояние существующего GUID контекста, так как другие VSPackage могут зависеть от них.

Пример

В следующем примере команды VSPackage демонстрируется динамическая видимость команды, управляемой контекстами команд без загрузки VSPackage.

Команда включена и отображается всякий раз, когда существует решение; т. е. каждый раз, когда один из следующих идентификаторов GUID контекста команды активен:

В примере обратите внимание, что каждый флаг команды является отдельным элементом Command Flag .

<Button guid="guidDynamicVisibilityCmdSet" id="cmdidMyCommand"
        priority="0x0100" type="Button">
  <Parent guid="guidDynamicVisibilityCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPic1" />
  <CommandFlag>DefaultDisabled</CommandFlag>
  <CommandFlag>DefaultInvisible</CommandFlag>
  <CommandFlag>DynamicVisibility</CommandFlag>
  <Strings>
    <CommandName>cmdidMyCommand</CommandName>
    <ButtonText>My Command name</ButtonText>
  </Strings>
</Button>

Кроме того, обратите внимание, что каждый контекст пользовательского интерфейса должен быть задан в отдельном VisibilityItem элементе, как показано ниже.

<VisibilityConstraints>
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                  id="cmdidMyCommand" context="UICONTEXT_EmptySolution" />
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                      id="cmdidMyCommand" context="UICONTEXT_SolutionHasSingleProject" />
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                  id="cmdidMyCommand" context="UICONTEXT_SolutionHasMultipleProjects" />
</VisibilityConstraints>