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

A-S*_*ani 5 vspackage vsix

描述


我开发了一个 Visual Studio 扩展 (VSPackage),它向 Visual Studio 添加了新的项目类型(使用CPS 项目系统)。我还向 VSPackage 添加了一些命令。

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

例子


例如:在下面的屏幕截图中,我想删除 Build 命令并添加自定义命令(例如mycommand)。

在此输入图像描述

我试过..


Parent将我的自定义命令 设置为IDM_VS_CTXT_PROJNODE.

问题


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

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

sbo*_*ema 4

你和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>
Run Code Online (Sandbox Code Playgroud)

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

第 2 步:将组添加到菜单

<Groups>  
  <Group guid="guidCmdSet" id="packageMenuGroup" priority="0x0600">
    <Parent guid="guidCmdSet" id="packageMenu" />
  </Group>    
</Groups>
Run Code Online (Sandbox Code Playgroud)

第 3 步:添加按钮

  <Button guid="guidCmdSet" id="specialBuildActionId" priority="0x0100" type="Button">
    <Parent guid="guidCmdSet" id="packageMenuGroup" />
    <CommandFlag>DynamicVisibility</CommandFlag>
    <Strings>
      <ButtonText>Special build</ButtonText>
    </Strings>
Run Code Online (Sandbox Code Playgroud)

第 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 = ???;
Run Code Online (Sandbox Code Playgroud)

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

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