Почему не отображается контекстное меню моего vspackage

У меня уже есть созданный мной пакет, и я хочу добавить меню в контекстное меню Code Window.

После небольшого поиска я нашел несколько статей, объясняющих, как это сделать. Проблема в том, что я не могу заставить его работать....

Вот мои объявления в файле vsct:

  <Button guid="guidDALGeneratorPkgCmdSet" id="cmdidDataFlow" priority="0x0100" type="Button">
    <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_CODEWIN"/>
    <CommandFlag>DynamicVisibility</CommandFlag>
    <Strings>
      <CommandName>cmdidDataFlow</CommandName>
      <ButtonText>Show data flow</ButtonText>
    </Strings>
  </Button>

и символы:

<GuidSymbol name="guidDALGeneratorPkgCmdSet" value="{d3269a87-a721-49a5-800b-0464fbdfd313}">

  <IDSymbol name="MyMenuGroup" value="0x1020" />
  <IDSymbol name="cmdidDALGenerator" value="0x0101" />
  <IDSymbol name="cmdidDataFlow" value="0x0102" />
</GuidSymbol>

и вот как я добавляю свое меню в свой класс Package:

CommandID dataFlowCID = new CommandID(GuidList.guidDALGeneratorPkgCmdSet, (int)PkgCmdIDList.cmdidDataFlow);
OleMenuCommand dataFlowMenu = new OleMenuCommand(showDataFlow, dataFlowCID);
dataFlowMenu.BeforeQueryStatus += new EventHandler(dataFlowMenu_BeforeQueryStatus);
mcs.AddCommand(dataFlowMenu);

Что я здесь делаю неправильно? Я должен что-то упустить, потому что почти каждый образец (и ТАКОЙ ответ на эту тему) предлагает добавить меню таким образом в пакет.....

Что я пробовал:

  • сначала создайте группу, затем добавьте мое меню в эту группу: не сработало
  • проверьте, использую ли я правильный GUID (с помощью этот трюк)
  • используйте IDG_VS_MENU_CONTEXTMENUS вместо IDM_VS_CTXT_CODEWIN (после просмотра этого сообщения: Как с помощью vsx создать подменю с командами?)
  • дайте тот же родитель, что и меню, которое на самом деле работает, во второе меню, которое все еще не отображается....
  • много безуспешных гуглений о моей проблеме...

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


person ppetrov    schedule 30.05.2013    source источник
comment
Вы когда-нибудь могли найти решение своей проблемы. Я сталкиваюсь с той же проблемой   -  person Stuart Smith    schedule 12.05.2015
comment
Извините, нет, я не... Это была небольшая часть большого проекта, поэтому я нашел другой способ выполнить то, что мне было нужно. Вы пробовали то, что предложил @Marcel?   -  person ppetrov    schedule 12.05.2015
comment
Да, он создает кнопку в контекстном меню, а не меню в контекстном меню. Так что это не помогло. Мое требование - создать меню в контекстном меню.   -  person Stuart Smith    schedule 12.05.2015


Ответы (4)


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

введите здесь описание изображения

Я создал новый проект расширения VSPackage, а затем обновил свой файл VSTS следующим образом, чтобы создать контекстное меню, показанное выше:

<Commands package="guidVSPackage2Pkg">
    <Groups>
      <Group guid="guidVSPackage2CmdSet" id="MyMenuGroup" priority="0x0600">
        <Parent guid="guidSHLMainMenu" id="IDM_VS_CTXT_CODEWIN"/>
      </Group>

     <Group guid="guidVSPackage2CmdSet" id="SubMenuGroup" priority="0x0602">
        <Parent guid="guidVSPackage2CmdSet" id="SubMenu" />
      </Group>
    </Groups>

    <Menus>
      <Menu guid="guidVSPackage2CmdSet" id="SubMenu" priority="0x0200" type="Menu">
        <Parent guid="guidVSPackage2CmdSet" id="MyMenuGroup" />
        <Strings>
          <ButtonText>Test Context Menu</ButtonText>
        </Strings>
      </Menu>
    </Menus>

    <Buttons>
      <Button guid="guidVSPackage2CmdSet" id="cmdidMyCommand" priority="0x0100" type="Button">
        <Parent guid="guidVSPackage2CmdSet" id="SubMenuGroup" />
        <Icon guid="guidImages" id="bmpPic1" />
        <Strings>
          <ButtonText>Context Menu Button</ButtonText>
        </Strings>
      </Button>
      </Buttons>

    <Bitmaps>
      <Bitmap guid="guidImages" href="Resources\Images.png" usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
    </Bitmaps>
  </Commands>
  <Symbols>
    <!-- This is the package guid. -->
    <GuidSymbol name="guidVSPackage2Pkg" value="{1fde2aca-f1c8-4fbc-abd1-58861d8b9520}" />

    <!-- This is the guid used to group the menu commands together -->
    <GuidSymbol name="guidVSPackage2CmdSet" value="{9cfc9dda-a054-4ff2-8c85-e6d2bff04874}">
      <IDSymbol name="SubMenu" value="0x1001"/>
      <IDSymbol name="SubMenuGroup" value="0x1000"/>
      <IDSymbol name="MyMenuGroup" value="0x1020" />
      <IDSymbol name="cmdidMyCommand" value="0x0100" />
    </GuidSymbol>

    <GuidSymbol name="guidImages" value="{b77d6bb1-566b-4ecb-a99f-9f99325ffd65}" >
      <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" />
      <IDSymbol name="bmpPicStrikethrough" value="6" />
    </GuidSymbol>
  </Symbols>
person Stuart Smith    schedule 12.05.2015

Для меня упомянутая константа работала. Я начал со стандартного шаблона для пакета VSPackage в Visual Studio 2013, а затем изменил родительский идентификатор на IDM_VS_CTXT_CODEWIN.

Вот что у меня есть сейчас:

vsct:

  <Button guid="guidCopyForReviewVSPackageCmdSet" id="cmdidCopyForReview" priority="0x0100" type="Button">
    <Parent guid="guidCopyForReviewVSPackageCmdSet" id="MyMenuGroup" />
    <Icon guid="guidImages" id="bmpPicSearch" />
    <Strings>
      <ButtonText>Copy for review (foswiki)</ButtonText>
    </Strings>
  </Button>

символы:

<!-- This is the guid used to group the menu commands together -->
<GuidSymbol name="guidCopyForReviewVSPackageCmdSet" value="{4ae6ff5a-6e7e-48bd-86b0-37fd9ab20629}">

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


<GuidSymbol name="guidImages" value="{3eb1aa0b-96aa-4364-a870-ca588a9491b5}" >
  <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" />
  <IDSymbol name="bmpPicStrikethrough" value="6" />
</GuidSymbol>

Adding the menu item in the package class:

            // Create the command for the menu item.
            CommandID menuCommandID = new CommandID(GuidList.guidCopyForReviewVSPackageCmdSet, (int)PkgCmdIDList.cmdidCopyForReview);
            MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID );
            mcs.AddCommand( menuItem );

Однако это показывает меню только в «реальном» окне кода, а не, например, в редакторе aspx/ascx.

person Marcel    schedule 13.03.2015
comment
Спасибо за Ваш ответ! Должно быть, я сделал что-то еще не так, но сейчас я не работаю над этим проектом, поэтому я проверю метод позже. - person ppetrov; 13.03.2015

Для редактора ASPX/ASCX используйте этот код:

Добавляем символ для контекстного меню:

<GuidSymbol name="ASPXContext" value="{D7E8C5E1-BDB8-11D0-9C88-0000F8040A53}">
  <IDSymbol name="menu" value="0x0035"/>
</GuidSymbol>

Добавляем контекстное меню:

<Group guid="CmdSet" id="contextMenuGroup" priority="0x0100">
  <Parent guid="ASPXContext" id="menu" />
</Group>

Дополнительные сведения см. по адресу: https://stackoverflow.com/a/31769170/2235860.

person sboulema    schedule 19.06.2017

В моем случае проблема заключалась в том, что я добавил файл ресурсов с записями 110/112/400 вручную. Когда вы позволяете мастерам генерировать все, файл .resx добавляется в .csproj немного по-другому:

<EmbeddedResource Include="Properties\Resources.resx">
  <!-- Without this line the menu will not appear: -->
  <MergeWithCTO>true</MergeWithCTO>
</EmbeddedResource>
person György Kőszeg    schedule 09.08.2019