12

我已经创建了一个包,我想在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);

我在这里做错了什么?我必须错过一些东西,因为几乎每个示例(以及关于该主题的 SO 答案)都建议在包中以这种方式添加菜单.....

我试过的:

  • 先创建一个组,然后在该组中添加我的菜单:没用
  • 检查我是否使用了正确的 GUID(使用这个技巧
  • 使用IDG_VS_MENU_CONTEXTMENUS代替IDM_VS_CTXT_CODEWIN(看过这篇文章后:Using vsx how do you create a sub menu with commands?
  • 将与实际工作的菜单相同的父级提供给第二个菜单,但仍未显示....
  • 很多关于我的问题的不成功的谷歌搜索......

正如你所看到的,我使用了该BeforeQueryStatus事件,但它永远不会被解雇......

4

4 回答 4

9

必须将上下文菜单添加到上下文菜单上的组中才能显示它......为此的语法花了我几天的试验和错误来确定。

在此处输入图像描述

我创建了一个新的 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>
于 2015-05-12T18:35:10.800 回答
3

对我来说,上面提到的常数有效。我从 Visual Studio 2013 中 VSPackage 的标准模板开始,然后将 Parent id 更改为 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>

在包类中添加菜单项:

            // 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 编辑器中。

于 2015-03-13T07:03:26.357 回答
0

就我而言,问题是我手动添加了带有 110/112/400 条目的资源文件。当您让向导生成所有内容时,将 .resx 文件添加到 .csproj 会有所不同:

<EmbeddedResource Include="Properties\Resources.resx">
  <!-- Without this line the menu will not appear: -->
  <MergeWithCTO>true</MergeWithCTO>
</EmbeddedResource>
于 2019-08-09T09:07:57.830 回答
0

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

于 2017-06-19T15:57:26.280 回答