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


Как VSPackages добавления элементов пользовательского интерфейса в IDE

VSPackage может добавлять элементы пользовательского интерфейса (пользовательского интерфейса), например, меню, панели инструментов и окна инструментов в интегрированной среде разработки (ide) Visual Studio.

Основы архитектуры

Набор правил и структур, которые позволяют VSPackage настраивать пользовательский интерфейс называется Архитектура таблиц команды. Архитектура таблиц команды основана на следующих основах разработки:

  • Пользовательский интерфейс не должен быть создан суматоху или смущен.

  • Пользовательский интерфейс должен быть динамическим, не является статическим.

  • Пользовательский интерфейс должен быть настраиваемым.

  • Пользовательский интерфейс должен быть полезен.

Пользовательский интерфейс не должен быть создан суматоху или смущен

  • Некоторые VSPackages может устанавливаться в сеансе Visual Studio этом узлы в VSPackage. Если в VSPackage добавляет команды, оно не должно прерывать ранее устанавливать VSPackages, но он также должен сделать его доступным другому VSPackages функции и включить их, чтобы способствовать функции в возврате.

  • Каждое меню, осуществляется ли оно с помощью основной строки меню, вложенного меню или в контекстном меню, может содержать пунктов меню, способствованы другим VSPackages. Поэтому будьте осторожны overcrowd пользовательский интерфейс. Если слишком много команды отображаются одновременно, то пользовательский интерфейс может смутить пользователей.

Пользовательский интерфейс должен быть динамическим, не статический

  • Команды могут отображать или скрывать в любое время, в зависимости от состояния основных данных, а также действий, связанных с текущего пользователя.

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

  • Элементы пользовательского интерфейса могут быть добавлена или удалена, когда VSPackage используется.

  • Элементы пользовательского интерфейса могут потребоваться дополнительные вызовы в VSPackage заполнили обнаружены их значений или их текущее состояние. Примеры таких элементов больше всего-недавн-используемых относятся списки файлов (MRU), полей со списком и селекторов цвета и текстуры.

  • Это может улучшить взаимодействие с пользователем для добавления команда в меню в другом VSPackages. Например, если команда, которую необходимо предоставить напоминает копияможно поместить команду в VSPackage, где каждое копия отображается.

Пользовательский интерфейс должен быть настраиваемым

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

  • Некоторые команды доступны только с помощью настройки; это значит, что команда не может быть доступна в меню или на панели инструментов до тех пор, пока пользователь не сможет добавить его с помощью Настройка диалоговое окно.

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

  • Команды могут выполняться с помощью команда окна. Поэтому среда разработки должна знать, какая команда соответствует определенной метке команды. Интегрированная среда разработки выполняет это с помощью процесса, называемого канонизации, где удаляются пробелы для сжатия имя команды в одно машинное слово. Например, &File канонизации "открыть" "FileOpen".

Пользовательский интерфейс должен быть полезным

  • Большинство элементов пользовательского интерфейса должны иметь подсказки.

  • Для лучшей производительности в VSPackage следует загрузить только при вызове одной из своих функций. Это называется "отложенной загрузки."

  • Добавление к запрошенному типу интегрированной среды разработки VSPackage должны иметь локализуемые.

  • Можно использовать растровые изображения, которые включены в Visual Studio или можно предоставить.

Архитектура таблиц команды Visual Studio

Как было отмечено, архитектура таблиц команды поддерживает foregoing архитектурных принципов. Принципы, абстракциями, структур данных и инструментами архитектуры таблицы команды выглядит следующим образом:

  • 3 Основных типа элементов: меню команды и группы. Меню можно предоставлять в пользовательском интерфейсе, например меню, вложенные меню, панели инструментов или окна инструментов. Команды процедуры, которые пользователь может выполнить в интегрированной среде разработки, и они могут представляться как пунктов меню, кнопки, списки или другие элементы управления. Группа контейнеров для меню и команд.

  • Каждый элемент задан по определению, описывающий элемент, ее приоритет по отношению к другим элементам и флаги, которые изменяют его расширений функциональности.

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

    Каждая команда должна иметь группу, что и родительская, даже если он является единственным дочерним элементом этой группы. Каждое стандартное меню должно также иметь родительскую группу. Панели инструментов и окна инструментов действуют как свои собственные родительские элементы. Группа может иметь как родительская строку основного меню Visual Studio или any меню, панели инструментов или окна инструментов.

Как элементы определяются

. Vsct файлы форматирования в формате XML. Файл .vsct определяет элементы пользовательского интерфейса для пакета и определяет, где эти элементы появляются в интегрированную среду разработки. Каждым меню, группе или команде в пакете сначала присвоено GUID и идентификатор в Symbols раздел. На протяжении всего файла .vsct, каждый меню выберите команду и группы определяются его сочетанием GUID и идентификатор. В следующем примере показана типичная Symbols раздел шаблоном, как генерируется, когда a пакета Visual Studio Команда меню выбирает в шаблоне.

<Symbols>
  <!-- This is the package guid. -->
  <GuidSymbol name="guidMenuTextPkg" value="{b1253bc6-d266-402b-89e7-5e3d3b22c746}" />

  <!-- This is the guid used to group the menu commands together -->
  <GuidSymbol name="guidMenuTextCmdSet" value="{a633d4e4-6c65-4436-a138-1abeba7c9a69}">

    <IDSymbol name="MyMenuGroup" value="0x1020" />
    <IDSymbol name="cmdidMyCommand" value="0x0100" />
  </GuidSymbol>

  <GuidSymbol name="guidImages" value="{53323d9a-972d-4671-bb5b-9e418480922f}" >
    <IDSymbol name="bmpPic1" value="1" />
    <IDSymbol name="bmpPic2" value="2" />
    <IDSymbol name="bmpPicSearch" value="3" />
    <IDSymbol name="bmpPicX" value="4" />
    <IDSymbol name="bmpPicArrows" value="5" />
  </GuidSymbol>
</Symbols>

Элемент верхнего уровня Symbols раздел Элемент GuidSymbol. GuidSymbol имена сопоставления элементов на идентификатор GUID, используемые средой разработки для определения пакетов и их части компонента.

Примечание

Идентификаторы GUID формируются автоматически шаблоном пакета Visual Studio.Можно также создать уникальный идентификатор GUID, щелкнув Создать GUID на Сервис меню.

Первый GuidSymbol элемент "пакета guid [PackageName]", GUID самого пакета. Это идентификатор GUID, который используется Visual Studio, чтобы загрузить пакет. Обычно он не имеет дочерних элементов.

По соглашению меню и команды группируются в разделе секундой GuidSymbol элемент "guid [PackageName] CmdSet" и растровые изображения в третью GuidSymbol элемент "guidImages". Не следует за этим соглашению, но каждый меню группы команд и растровое изображение должны быть дочерним элементом a GuidSymbol элемент.

Во втором GuidSymbol элемент, который представляет набор команд пакета, несколько IDSymbol элементы. Каждое Элемент IDSymbol сопоставляет имя числовым значением и может представлять меню, группа или команду, которая является частью набора команд. IDSymbol элементы третьего GuidSymbol элемент представляет растровые изображения, которые могут быть использованы в виде значков для команд. Так как пары GUID/ID должны быть уникальными в приложении нет 2 дочерних элементов того же GuidSymbol элемент может иметь одно и то же значение.

Меню Группы и команды

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

  • A guid атрибут, который соответствует имени GuidSymbol элемент, для которого определен элемент пользовательского интерфейса.

  • id атрибут, который соответствует имени, связанное IDSymbol элемент.

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

  • A priority атрибут, который определяет расположение элемента пользовательского интерфейса в родительских меню или группе.

  • A Элемент Parent то есть guid и id атрибуты, определяющие подпись родительских меню или группы.

Меню

Каждое меню определено как a Элемент Menu в Menus раздел. Меню должны иметь guid" idи priority атрибуты и a Parent элемент, а также следующие дополнительные атрибуты и дочерние элементы:

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

  • A Элемент Strings содержит a Элемент ButtonText, который определяет заголовок меню в интегрированной среде разработки и a Элемент CommandName, указывающая имя, которое используется в команда окно для доступа к меню.

  • Дополнительные флаги. A Элемент CommandFlag может показаться, что в определение меню просмотр или изменение его расширения функциональности в интегрированной среде разработки.

Каждые Menu элемент должен иметь группу, что его родительским элементом, если он не будет фиксируемого элемента как панель инструментов. Закрепляемое меню собственный родительский элемент. Дополнительные сведения о меню и значений type атрибут см. в разделе Элемент Menu документация.

В следующем примере показано меню, которое отображается в строке меню рядом с Visual Studio Сервис меню.

<Menu guid="guidTopLevelMenuCmdSet"
id="TopLevelMenu" priority="0x700" type="Menu">
  <Parent guid="guidSHLMainMenu"
          id="IDG_VS_MM_TOOLSADDINS" />
  <Strings>
    <ButtonText>TestMenu</ButtonText>
    <CommandName>TestMenu</CommandName>
  </Strings>
</Menu>

Groups

Группа элемент, заданный в Groups раздел файла .vsct. Группы лишь контейнеры. Они не отображаются в интегрированную среду разработки, кроме как линии раздела в меню. Следовательно, a Элемент Group определяет только его подпись, приоритетом и родительским элементом.

Группа может иметь меню самого другую группу или в качестве родительского. Однако родительский обычно меню или на панели инструментов. Меню в предыдущем примере дочерний элемент IDG_VS_MM_TOOLSADDINS группа, и эта группа дочернего элемента строки меню Visual Studio. Группа в следующем примере дочерний элемент меню в предыдущем примере.

 <Group guid="guidTopLevelMenuCmdSet" id="MyMenuGroup"
priority="0x0600">
   <Parent guid="guidTopLevelMenuCmdSet" id="TopLevelMenu"/>
 </Group>

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

<Menu guid="guidTopLevelMenuCmdSet" id="SubMenu"
priority="0x0100" type="Menu">
  <Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup"/>
  <Strings>
    <ButtonText>Sub Menu</ButtonText>
    <CommandName>Sub Menu</CommandName>
  </Strings>
</Menu>

Команды

Команды, указываемые интегрированная среда разработки указана, например, a Элемент Button или a Элемент Combo. Появиться в меню или на панели инструментов, команда должна иметь группу, что его родительским элементом.

Кнопки

Кнопок определяются в Buttons раздел. Любой пункта меню, кнопки или другой элемент, который пользователь щелкает для выполнения одной команды, считаются кнопкой. Некоторые типы кнопок могут также включать функциональность списка. Кнопки имеют атрибуты этих же необходимые и необязательные, что меню имеют а также могут иметь Элемент Icon идентификатор, указывающий идентификатор GUID и растрового изображения, представляющий кнопку в интегрированной среде разработки. Дополнительные сведения о кнопках и их атрибутах см. в разделе Элемент Buttons документация.

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

<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>

Combos

В Combos Combos раздел. Каждое Combo представляет элемент раскрывающегося списка в интегрированной среде разработки. Список может быть или не быть записываемым пользователями, в зависимости от значения type атрибут комбинированного. Combos имеет те же элементы и расширения функциональности, которые имеют кнопки, а также может содержать следующие дополнительные атрибуты:

  • A defaultWidth атрибут, указывающий ширину в пикселях.

  • idCommandList атрибут, указывающий список, содержащий элементы, которые отображаются в списке. Список команд должна быть объявлена в одном GuidSymbol узел, который содержит комбинированное.

В следующем примере определяется комбинированный элемент.

<Combos>
  <Combo guid="guidFirstToolWinCmdSet"
         id="cmdidWindowsMediaFilename"
         priority="0x0100" type="DynamicCombo"
         idCommandList="cmdidWindowsMediaFilenameGetList"
         defaultWidth="130">
    <Parent guid="guidFirstToolWinCmdSet"
            id="ToolbarGroupID" />
    <CommandFlag>IconAndText</CommandFlag>
    <CommandFlag>CommandWellOnly</CommandFlag>
    <CommandFlag>StretchHorizontally</CommandFlag>
    <Strings>
      <CommandName>Filename</CommandName>
      <ButtonText>Enter a Filename</ButtonText>
    </Strings>
  </Combo>
</Combos>

Точечные рисунки

Команды, которые будут отображены вместе с значком должны включать Icon элемент, который ссылается на растровое изображение с помощью его идентификатора GUID и идентификатора. Каждое точечное изображение определено как a Элемент Bitmap в Bitmaps раздел. Единственные необходимые атрибуты a Bitmap определение guid и href, указывающий на исходный файл. Если исходный файл прокладка ресурса, a usedList требуются также атрибут, перечислены доступные образы в области. Дополнительные сведения см. в документации по Элемент Bitmap.

Родительские связи

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

Элемент

Определено в этом разделе команды таблицы

Может содержаться (например, родительский элемент или positioning в CommandPlacements раздел или оба)

Может содержать прямоугольник (называется родительский)

Группа

Элемент Groupsинтегрированная среда разработки другого VSPackages

Меню группа, сам элемент

Меню группы и команды

Меню

Элемент Menusинтегрированная среда разработки другого VSPackages

1 с n группы

0 с n группы

Панель инструментов

Элемент Menusинтегрированная среда разработки другого VSPackages

Сам элемент

0 с n группы

Menu Item

Элемент Buttonsинтегрированная среда разработки другого VSPackages

1 с n группы, сам элемент

-0 с n группы

Кнопка

Элемент Buttonsинтегрированная среда разработки другого VSPackages

1 с n группы, сам элемент

Комбинировано

Элемент Combosинтегрированная среда разработки другого VSPackages

1 с n группы, сам элемент

Меню выберите команду и размещение группы

Меню группы или команды могут появляться в нескольких расположение в интегрированной среде разработки. Для элементов, отображаемых на несколько расположений, его необходимо добавить к CommandPlacements раздел how a Элемент CommandPlacement. Любое меню группа или команда может быть добавлен как позиционирование команды. Однако панели инструментов нельзя поместить таким образом, поскольку они не могут использоваться в нескольких контекст-чувствительные расположения.

Размещения команды имеют guid" idи priority атрибуты. Идентификаторы GUID и идентификаторы должны совпадать с элемента, который размещается. priority атрибут управляет positioning элемента относительно других элементов. Когда интегрированная среда разработки объединяет две или несколько элементов, имеющих один и тот же приоритет, их размещения не определены, поскольку интегрированная среда разработки не гарантирует, что ресурсы пакета считывают в том же порядке, каждый раз, когда пакет создан.

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

Видимость и контекст команд

При установке нескольких VSPackages, изобилие меню, пунктов меню и панелей инструментов может создать суматоху интегрированной среды разработки. Чтобы избежать этой проблемы, можно отслеживать видимость отдельных элементов пользовательского интерфейса с помощью Ограничения видимости и флаги команды.

Ограничения видимости

Ограничение видимости набора в виде a Элемент VisibilityItem в VisibilityConstraints раздел. Ограничение видимости определяет конкретные контексты пользовательского интерфейса, в которых элемент целевого объекта является видимым. Меню или команду, включенных в этом разделе, отображаются, только если один из заданных контекстов активен. Если меню или команда не указывают ссылки в этом разделе, всегда отображается по умолчанию. Этот шаг не применяется к группам.

VisibilityItem элементы должны иметь 3 атрибута следующим образом: guid и id элемент пользовательского интерфейса, и целевого объекта context. context атрибут указывает, когда элемент целевого объекта будет отображаться и принимает любой допустимый контекст пользовательского интерфейса в качестве его значения. Константы контекста пользовательского интерфейса для Visual Studio элементы VSConstants класс. Каждые VisibilityItem элемент может принимать только одно значение контекста. Чтобы применить второй контекст создайте секунду VisibilityItem элемент, который указывает на один и тот же элемент, как показано в следующем примере.

<VisibilityConstraints>
  <VisibilityItem guid="guidSolutionToolbarCmdSet"
        id="cmdidTestCmd"
        context="UICONTEXT_SolutionHasSingleProject" />
  <VisibilityItem guid="guidSolutionToolbarCmdSet"
        id="cmdidTestCmd"
        context="UICONTEXT_SolutionHasMultipleProjects" />
</VisibilityConstraints>

Флаги команды

Следующие флаги команды могут повлиять на видимость меню и команд они применяются.

  • AlwaysCreate
    Меню создается даже если он не содержит группы или кнопки.

    Допустимы для: Menu

  • CommandWellOnly
    Примените этот пометить если команда не отображается в меню верхнего уровня и необходимо сделать его доступным для дополнительной настройки оболочки, например, при привязке к ключу. После того как VSPackage устанавливается, пользователь может настраивать эти команды, открыв Параметры диалоговое окно и затем изменить расположение команды в рамках Среда клавиатуры категория. Не влияет на позиционирование на контекстных меню, панелей инструментов, контроллерах меню или вложенного меню.

    Допустимы для: Button" Combo

  • DefaultDisabled
    Заблокировано не загружен по умолчанию команда реализует команду или VSPackage, если не был вызван метод QueryStatus.

    Допустимы для: Button" Combo

  • DefaultInvisible
    Не загружен по умолчанию команда невидимые если VSPackage, реализующий команды или не был вызван метод QueryStatus.

    Быть совмещено с DynamicVisibility пометить.

    Допустимы для: Button" Combo" Menu

  • DynamicVisibility
    Видимость команды может быть изменена с помощью метода QueryStatus или идентификаторы GUID контекста, который включается в VisibilityConstraints раздел.

    Применяется к командам, отображаемому в меню, а не на панели инструментов. Элементы верхнего уровня панели инструментов можно отключить, но не скрытый, если пометить OLECMDF_INVISIBLE возвращается из метода QueryStatus.

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

    Быть совмещено с DefaultInvisible пометить.

    Допустимы для: Button" Combo" Menu

  • NoShowOnMenuController
    Если для команды, которой принадлежит пометить располагается на контроллер меню команда не отображается в раскрывающемся списке.

    Допустимы для: Button

Дополнительные сведения о флагах команд см. в разделе Элемент CommandFlag документация.

Общие требования

Команда должна передаваться следующий набор тестов, прежде чем ее можно отображать и включать:

  • Команда располагается правильно.

  • DefaultInvisible пометить не задан.

  • Родительские меню или на панели инструментов отображаются.

  • Команда не из-за записи контекста в незрима Элемент VisibilityConstraints раздел.

  • Код, реализующий VSPackage IOleCommandTarget интерфейс отображает и включает команду. Код интерфейса не перехватил и подействовал.

  • Когда пользователь щелкает команда, он будет субъекта в процедуру, конспектирована in алгоритм маршрутизации команд.

Вызывать стандартные команды

Элемент UsedCommands разрешает VSPackages для доступа к командам, которые предоставляются другим VSPackages или интегрированной средой разработки. Для этого создайте a Элемент UsedCommand то есть GUID и идентификатор команды использовать. Это гарантирует, что команда будет загружена Visual Studio, даже если не является частью текущей конфигурации Visual Studio. Дополнительные сведения см. в разделе Элемент UsedCommand.

Внешний вид элемента интерфейса

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

  • Visual Studio предлагает множество элементов пользовательского интерфейса, которые выглядят по-разному, в зависимости от размещения.

  • Элемент пользовательского интерфейса, который определен с помощью QueryStatus пометить не будет отображаться в интегрированной среде разработки, если он не сможет то отображается ее реализации VSPackage VisibilityConstraints метод или связанное с заданным контекстом пользовательского интерфейса DefaultInvisible раздел.

  • Даже успешно, находящаяся команда не может отображаться. Это происходит потому, что скрывает интегрированной среды разработки автоматически или показаны некоторые команды, в зависимости от интерфейсов, VSPackage (или нет) снабжало. Например, реализация VSPackage некоторых интерфейсов построения будет автоматически отображаться построение-родственные пунктов меню.

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

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

  • Чтобы вызвать некоторые элементы пользовательского интерфейса отображаться в интегрированной среде разработки, необходимо реализовать один или несколько интерфейсов, либо написать определенный код.

См. также

Основные понятия

Making Commands Available

Другие ресурсы

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

Command Table Configuration (.ctc) Files

Command Table Format Reference

Command Routing in VSPackages