如何在解决方案资源管理器中为特定项目类型自定义上下文菜单?

时间:2016-06-14 17:57:24

标签: vsix vspackage

描述

我开发了一个Visual Studio扩展(VSPackage),它将新的项目类型添加到Visual Studio(使用CPS Project System)。我还在VSPackage中添加了一些命令。

在解决方案资源管理器中右键单击我的项目节点时,我希望显示一个自定义的上下文菜单。

示例

<小时/> 例如:在下面的屏幕截图中,我想摆脱Build命令并添加自定义命令(e.x. mycommand)。

enter image description here

我试过..

<小时/> 将我的自定义命令的Parent设置为IDM_VS_CTXT_PROJNODE

问题

  • 当我创建新的自定义项目类型时,如何在解决方案资源管理器中为我的项目节点创建新的上下文菜单?

  • 如何仅为自定义项目删除/添加命令到上下文菜单: 如果我有一个C#项目,上下文菜单应该是默认项目,如果我添加一个MyProjectType项目,我想在解决方案资源管理器中右键单击项目节点时看到不同的上下文菜单

1 个答案:

答案 0 :(得分:1)

您与IDM_VS_CTXT_PROJNODE父母亲很近。

这是我在FluentMigratorRunner扩展程序中实现该功能的方法,该扩展程序仅在引用FluentMigrator NuGet程序包的情况下显示项目的上下文菜单项。

步骤1:将一个子菜单添加到上下文菜单

<Menus>
  <Menu guid="guidCmdSet" id="packageMenu" priority="0x0300" type="Menu">
    <Parent guid="guidSHLMainMenu" id="IDG_VS_CTXT_PROJECT_BUILD" />
    <CommandFlag>DynamicVisibility</CommandFlag>
    <CommandFlag>DefaultInvisible</CommandFlag>
    <Strings>
      <ButtonText>CPSProject</ButtonText>
      <CommandName>CPSProject</CommandName>
    </Strings>
  </Menu>

请注意添加的特殊CommandFlag元素。

第2步:将组添加到菜单

<Groups>  
  <Group guid="guidCmdSet" id="packageMenuGroup" priority="0x0600">
    <Parent guid="guidCmdSet" id="packageMenu" />
  </Group>    
</Groups>

步骤3:添加按钮     

  <Button guid="guidCmdSet" id="specialBuildActionId" priority="0x0100" type="Button">
    <Parent guid="guidCmdSet" id="packageMenuGroup" />
    <CommandFlag>DynamicVisibility</CommandFlag>
    <Strings>
      <ButtonText>Special build</ButtonText>
    </Strings>

第4步:在* Package.cs

中添加菜单
protected override async System.Threading.Tasks.Task InitializeAsync(System.Threading.CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)
{
    // Initialize the Fluent Migrator Menu, should only be visible for projects with FluentMigrator reference
    var mcs = await GetServiceAsync(typeof(IMenuCommandService)) as OleMenuCommandService;
    var menuCommandId = new CommandID(packageCmdSetGuidString, 0x1010);
    var menuItem = new OleMenuCommand(null, menuCommandId);
    menuItem.BeforeQueryStatus += MenuItem_BeforeQueryStatus;

    mcs.AddCommand(menuItem);
}

private void MenuItem_BeforeQueryStatus(object sender, EventArgs e) =>
    ((OleMenuCommand)sender).Visible = ???;

请注意添加的BeforeQueryStatus事件处理程序。

在该事件处理程序中,您可以检查项目的类型,并返回一个布尔控件,是否应将额外的上下文菜单显示为是或否