如何使用VSPackage在Visual Studio 2012中添加多个菜单项?

时间:2014-01-14 20:03:47

标签: c# visual-studio-2012 sdk

我研究了这个link,以便在Visual Studio 2012中使用VSPackage添加自定义菜单命令。

一切都很好,直到我想添加多个菜单项。

在提供的文档中,他们没有解释如何添加一个菜单项。

例如,我在TfsUtility.vsct文件中进行了以下设置:

<Menus>
    <Menu guid="guidTfsUtilityCmdSet" id="TfsUtility" priority="0x700" type="Menu">
        <Parent guid="guidSHLMainMenu" id="IDG_VS_MM_TOOLSADDINS" />
        <Strings>
            <ButtonText>Tfs Utility</ButtonText>
            <CommandName>Tfs Utility</CommandName>
        </Strings>
    </Menu>
</Menus>

...

<Group guid="guidTfsUtilityCmdSet" id="MyMenuGroup" priority="0x0600">
    <Parent guid="guidTfsUtilityCmdSet" id="TfsUtility"/>
</Group>

...

<Button guid="guidTfsUtilityCmdSet" id="cmdidMyCommand" priority="0x0100" type="Button">
    <Parent guid="guidTfsUtilityCmdSet" id="MyMenuGroup" />
    <Strings>
        <ButtonText>Branch</ButtonText>
    </Strings>
</Button>

...

<GuidSymbol name="guidTfsUtilityCmdSet" value="{d5549d5d-47af-40e0-a7e5-e9ed7f64d577}">

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

    <IDSymbol name="TfsUtility" value="0x1021"/>
</GuidSymbol>

问题:

  1. 如何在菜单选项中添加更多选项(例如After Branch)? enter image description here

  2. 如何为每个菜单项关联命令?我想为每个菜单项显示不同的消息。

  3. 非常感谢

2 个答案:

答案 0 :(得分:3)

  1. 要再添加一个菜单项,请再添加一个具有不同ID的Button部分。

  2. 要实现命令,您需要提供MenuItemCallback并将其注册到OleMenuCommandService:

  3.   

    OleMenuCommandService mcs = GetService(typeof(IMenuCommandService))as OleMenuCommandService;

    if ( null != mcs )
    {
       // Create the command for the menu item.
       CommandID menuCommandID = new CommandID(guidCommandGroup, myCommandID);
       MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID );
       mcs.AddCommand( menuItem );
    }
    

    有关详细信息,请参阅Command Implementation

答案 1 :(得分:1)

我找到了解决方案:

  1. PkgCmdIDList页面中,添加一些常量,例如:

    public const uint cmdiChangesets = 0x101; // or cmdiYourMenu instead of cmdiChangesets
    public const uint cmdidCheckin = 0x102;
    public const uint cmdidGet = 0x103;
    
  2. 为点击事件创建回调(在YourProjectNamePackage中,对我来说是TfsUtilityPackage),如

    private void TfsMenuItemBranchCallback(object sender, EventArgs e)
    {
        // do something
    }
    
    private void TfsMenuItemPendingCallback(object sender, EventArgs e)
    {
        // do something
    }
    
    ...
    
  3. 在XXUtility.vsct(对我来说是TfsUtility.vsct)中,在<Buttons>节点中创建按钮

            <Button guid="guidTfsUtilityCmdSet" id="cmdidChangesets" priority="0x0101" type="Button">
                <Parent guid="guidTfsUtilityCmdSet" id="MyMenuGroup" />
                <Strings>
                    <ButtonText>Changesets</ButtonText>
                </Strings>
            </Button>
    
            <Button guid="guidTfsUtilityCmdSet" id="cmdidCheckin" priority="0x0102" type="Button">
                <Parent guid="guidTfsUtilityCmdSet" id="MyMenuGroup" />
                <Strings>
                    <ButtonText>Pending changes</ButtonText>
                </Strings>
            </Button>
    
  4. <GuidSymbol>节点

    中添加IDSymbol

    <IDSymbol name="cmdidChangesets" value="0x0101" /> <IDSymbol name="cmdidCheckin" value="0x0102" />

  5. 0x0101必须与来自PkgCmdIDList类的常量值0x101匹配,并且值必须不同才能显示所有菜单项