Создать новое меню верхнего уровня в Visual Studio

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

Я прочитал это руководство, которое помогло мне добавить новое меню верхнего уровня, но не смогло понять логику всех шагов. Руководство не совсем ясно, что создает каждый из шагов или как вы можете изменить вывод.
То, что создают шаги, является новым меню верхнего уровня с единственным пунктом под ним. Я пытаюсь создать некоторую иерархию в моем меню (т.е. Верхний уровень -> Подкатегория -> Команды), но потерял abit со всей структурой групп / меню / идентификаторов. Есть ли четкое объяснение структуры этих файлов? Документация или учебник? Если бы кто-то имел опыт в этой теме и мог бы помочь разобраться, я был бы очень признателен...

3 ответа

Решение

Я не пробовал создавать элементы иерархического меню, но у меня были похожие проблемы с файлом Visual SDK .vcst. Это боль. Несколько вещей, которые вы можете сделать.

  1. Установите редактор пакетов VS в запись в блоге Visual Studio для этого: http://blogs.msdn.com/b/visualstudio/archive/2010/09/08/introducing-the-vspackage-builder.aspx
  2. Загрузите исходный код (с открытым исходным кодом, чтобы вы могли видеть, как они это делают) для надстройки, которая делает подобные вещи. Примером является AnkhSVN, который является надстройкой хранилища Subversion для Visual Studio. Вот исходный код: http://ankhsvn.open.collab.net/source/browse/ankhsvn/

Я предполагаю, что в настоящее время под "надстройкой" вы подразумеваете расширение, являющееся пакетом VS (использующим VS SDK), поскольку "надстройка" была более старой формой расширения для VS 2013 и ниже. (Если вы действительно имеете в виду "надстройку", то посмотрите мой пример HOWTO: Добавление кнопок, панелей команд и панелей инструментов в Visual Studio .NET из надстройки)

Пакеты используют файлы.vsct. Чтобы ответить на ваш вопрос, посмотрите файлы.vsct моих примеров здесь:

  • CommandTopMenu
  • CommandSubMenu

(а для изучения см. также другие для контекстных меню, панелей инструментов и т. д.). В файле.vcst они используют "CommandPlacements", чтобы отделить определение элемента от его "размещения", и комментарии, чтобы объяснить взаимосвязь между 3 видами элементов:

  1. Меню (Главное меню / Верхние меню / Подменю / Контекстные меню) и Панели инструментов.
  2. Группы: группа - это контейнер для других групп, а также для команд и подменю.
  3. команды

Помните правила:

  • Родителем верхнего меню всегда является главное меню VS, а не группа
  • Родителем подменю всегда является группа, а не панель инструментов или меню любого типа.
  • Родителем команды всегда является группа, а не панель инструментов или меню любого типа (то же правило, что и для подменю).
  • Родителем группы может быть меню, панель инструментов, контекстное меню и т. Д., А также может быть другая группа.
  • Меню (любой вид) или панель инструментов могут быть созданы вашим расширением (кроме главного меню VS) или существующим из VS, обозначенным префиксом "IDM_". См. Идентификаторы GUID и идентификаторы меню Visual Studio, а также идентификаторы GUID и идентификаторы панелей инструментов Visual Studio.
  • Группа может быть либо новой (созданной вашим расширением), либо существующей группой Visual Studio, идентифицируемой префиксом "IDG_". В приведенных выше ссылках есть несколько встроенных групп Visual Studio, но для более полного списка установите расширение ExtensionTools (Mads Kristensen), которое предоставляет intellisense в файле.vsct, или проверьте исходный код его файла VsctBuiltInCache.cs.

Пример кода

<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="...">
  <!-- Extern section unchanged -->
  <Commands package="guidHowToPackagePkg">
    <Menus>
      <!-- New menu added -->
      <Menu guid="guidBasicVSCTSampleCmdSet" id="SubMenu" priority="0x200"
        type="Menu">
        <Parent guid="guidBasicVSCTSampleCmdSet" id="TopLevelMenuGroup" />
        <Strings>
          <ButtonText>Other Commands</ButtonText>
          <CommandName>Other Commands</CommandName>
        </Strings>
      </Menu>
    </Menus>
    <Groups>
      <!-- Group changed to SubMenuGroup and attached to SubMenu -->
      <Group guid="guidBasicVSCTSampleCmdSet" id="SubMenuGroup"
        priority="0x0600">
        <Parent guid="guidBasicVSCTSampleCmdSet" id="SubMenu"/>
      </Group>
    </Groups>

    <Buttons>
      <!-- We attached these two buttons to SubMenuGroup -->
      <Button guid="guidBasicVSCTSampleCmdSet" id="ThirdCommand" priority="0x0100"
        type="Button">
        <Parent guid="guidBasicVSCTSampleCmdSet" id="SubMenuGroup" />
        <Icon guid="guidImages" id="bmpPicX" />
        <Strings>
          <CommandName>ThirdCommand</CommandName>
          <ButtonText>Third Command</ButtonText>
        </Strings>
      </Button>
      <Button guid="guidBasicVSCTSampleCmdSet" id="FourthCommand"
        priority="0x0101" type="Button">
        <Parent guid="guidBasicVSCTSampleCmdSet" id="SubMenuGroup" />
        <Icon guid="guidImages" id="bmpPicArrows" />
        <Strings>
          <CommandName>FourthCommand</CommandName>
          <ButtonText>Fourth Command</ButtonText>
        </Strings>
      </Button>
    </Buttons>

  </Commands>

  <Symbols>
    <!-- We add a SubMenu and changed SubMenuGroup -->
    <GuidSymbol name="guidBasicVSCTSampleCmdSet" value="...">
      <IDSymbol name="SubMenu" value="0x0101" />
      <IDSymbol name="SubMenuGroup" value="0x0201" />
    </GuidSymbol>
  </Symbols>
</CommandTable>

Это предоставляет вам следующее меню верхнего уровня:

Вот полная глава по теме. Это в значительной степени объясняет все, что нужно знать в (иерархическом) меню.

http://dotneteers.net/blogs/divedeeper/archive/2010/05/23/vs-2010-package-development-chapter-2-commands-menus-and-toolbars.aspx

Другие вопросы по тегам