首先我们使用向导生成一个package的扩展,里面就会发现一个vsct文件。vsct文件的全称是Visual Studio Command Table,它其实就是一个xml文件,通过一定的规则来描述visual Studio的command布局。

添加一个菜单项:

首先我们在vsct文件你们加一个菜单项:

<?xml version="1.0" encoding="utf-8"?>
<CommandTable
xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <Extern
href="stdidcmd.h"/>
    <Extern
href="vsshlids.h"/>
    <Commands
package="vsPackage">
        <Groups>
            <Group
guid="cmdSet"
id="MyMenuGroup"
priority="0x0600">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
        </Groups>
        <Buttons>
            <Button
guid="cmdSet"
id="cmdidMyCommand"
priority="0x0100"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup" />
                <Strings>
                    <ButtonText>我的工具箱</ButtonText>
                </Strings>
            </Button>
        </Buttons>
    </Commands>
    <Symbols>
        <GuidSymbol
name="vsPackage"
value="{0b468468-bf83-4dc6-9253-ca5970142e5d}" />
        <GuidSymbol
name="cmdSet"
value="{b001c53d-3e2d-4c8f-9787-73ed59a7c412}">
            <IDSymbol
name="MyMenuGroup"
value="0x1020" />
            <IDSymbol
name="cmdidMyCommand"
value="0x0100" />
        </GuidSymbol>
    </Symbols>
</CommandTable>

其中高亮部分就是我添加的内容,执行效果如下:

再次添加一个菜单项:

再次添加一个菜单项也是非常简单的,只要在Buttons里面增加一项即可:

<?xml
version="1.0"
encoding="utf-8"?>
<CommandTable
xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <Extern
href="stdidcmd.h"/>
    <Extern
href="vsshlids.h"/>
    <Commands
package="vsPackage">
        <Groups>
            <Group
guid="cmdSet"
id="MyMenuGroup"
priority="0x0600">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
        </Groups>
        <Buttons>
            <Button
guid="cmdSet"
id="cmdidMyCommand"
priority="0x0100"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup" />
                <Strings>
                    <ButtonText>我的工具箱</ButtonText>
                </Strings>
            </Button>
            <Button
guid="cmdSet"
id="cmdidMyCommand2"
priority="0x0101"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup" />
                <Strings>
                    <ButtonText>我的工具箱2</ButtonText>
                </Strings>
            </Button>
        </Buttons>
    </Commands>
    <Symbols>
        <GuidSymbol
name="vsPackage"
value="{0b468468-bf83-4dc6-9253-ca5970142e5d}" />
        <GuidSymbol
name="cmdSet"
value="{b001c53d-3e2d-4c8f-9787-73ed59a7c412}">
            <IDSymbol
name="MyMenuGroup"
value="0x1020" />
            <IDSymbol
name="cmdidMyCommand"
value="0x0100" />
            <IDSymbol
name="cmdidMyCommand2"
value="0x0101" />
        </GuidSymbol>
    </Symbols>
</CommandTable>

生成的效果如下:

添加分组

现在我们来把菜单进行分组:首先在Groups项中添加一个Group,然后修改Button的ParentId即可。

<?xml
version="1.0"
encoding="utf-8"?>
<CommandTable
xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <Extern
href="stdidcmd.h"/>
    <Extern
href="vsshlids.h"/>
    <Commands
package="vsPackage">
        <Groups>
            <Group
guid="cmdSet"
id="MyMenuGroup"
priority="0x0600">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
            <Group
guid="cmdSet"
id="MyMenuGroup2"
priority="0x0601">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
        </Groups>
        <Buttons>
            <Button
guid="cmdSet"
id="cmdidMyCommand"
priority="0x0100"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup" />
                <Strings>
                    <ButtonText>我的工具箱</ButtonText>
                </Strings>
            </Button>
            <Button
guid="cmdSet"
id="cmdidMyCommand2"
priority="0x0101"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup2" />
                <Strings>
                    <ButtonText>我的工具箱2</ButtonText>
                </Strings>
            </Button>
        </Buttons>
    </Commands>
    <Symbols>
        <GuidSymbol
name="vsPackage"
value="{0b468468-bf83-4dc6-9253-ca5970142e5d}" />
        <GuidSymbol
name="cmdSet"
value="{b001c53d-3e2d-4c8f-9787-73ed59a7c412}">
            <IDSymbol
name="MyMenuGroup"
value="0x1020" />
            <IDSymbol
name="MyMenuGroup2"
value="0x1021" />
            <IDSymbol
name="cmdidMyCommand"
value="0x0100" />
            <IDSymbol
name="cmdidMyCommand2"
value="0x0101" />
        </GuidSymbol>
    </Symbols>
</CommandTable>

效果如下:

在菜单中添加图标

在菜单中添加图标要稍微麻烦点:首先需要添加一个Bitmaps分组,然后修改Button的Icon属性。

<?xml
version="1.0"
encoding="utf-8"?>
<CommandTable
xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <Extern
href="stdidcmd.h"/>
    <Extern
href="vsshlids.h"/>
    <Commands
package="vsPackage">
        <Groups>
            <Group
guid="cmdSet"
id="MyMenuGroup"
priority="0x0600">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
            <Group
guid="cmdSet"
id="MyMenuGroup2"
priority="0x0601">
                <Parent
guid="guidSHLMainMenu"
id="IDM_VS_MENU_TOOLS"/>
            </Group>
        </Groups>
        <Buttons>
            <Button
guid="cmdSet"
id="cmdidMyCommand"
priority="0x0100"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup" />
                <Icon
guid="guidImages"
id="bmpPic1" />
                <Strings>
                    <ButtonText>我的工具箱</ButtonText>
                </Strings>
            </Button>
            <Button
guid="cmdSet"
id="cmdidMyCommand2"
priority="0x0101"
type="Button">
                <Parent
guid="cmdSet"
id="MyMenuGroup2" />
                <Icon
guid="guidImages"
id="bmpPicSearch" />
                <Strings>
                    <ButtonText>我的工具箱2</ButtonText>
                </Strings>
            </Button>
        </Buttons>
        <Bitmaps>
            <Bitmap
guid="guidImages"
href="Resources\Images.png"
usedList="bmpPic1, bmpPic2, bmpPicSearch, bmpPicX, bmpPicArrows"/>
        </Bitmaps>
    </Commands>
    <Symbols>
        <GuidSymbol
name="vsPackage"
value="{0b468468-bf83-4dc6-9253-ca5970142e5d}" />
        <GuidSymbol
name="cmdSet"
value="{b001c53d-3e2d-4c8f-9787-73ed59a7c412}">
            <IDSymbol
name="MyMenuGroup"
value="0x1020" />
            <IDSymbol
name="MyMenuGroup2"
value="0x1021" />
            <IDSymbol
name="cmdidMyCommand"
value="0x0100" />
            <IDSymbol
name="cmdidMyCommand2"
value="0x0101" />
        </GuidSymbol>
        <GuidSymbol
name="guidImages"
value="{f3517729-ad9a-4c24-9f72-288fafa0758d}" >
            <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>
</CommandTable>

生成的效果如下:

在菜单中关联命令

通过向导生成Package时,会自动生成一个Package的子类,重载其Initialize函数,在里面加入事件处理函数即可。向导默认已经给我们生成了一个示例,我们只需要修改其处理函数和添加新的按钮的事件即可。

protected
override
void Initialize()
    {
        base.Initialize();

// Add our command handlers for menu (commands must exist in the .vsct file)
        OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as
OleMenuCommandService;
        if (null != mcs)
        {
            // Create the command for the menu item.
            CommandID menuCommandID = new
CommandID(GuidList.guidVSPackage3CmdSet, (int)PkgCmdIDList.cmdidMyCommand);
            MenuCommand menuItem = new
MenuCommand((s, e) => System.Windows.Forms.MessageBox.Show("hello world"), menuCommandID);
            mcs.AddCommand(menuItem);
        }
    }

Visual Studio Package扩展——vsct文件简介的更多相关文章

  1. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  2. Visual Studio Package 插件开发

    背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包"不亦乐乎"...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一 ...

  3. Visual Studio Package 插件开发(Visual Studio SDK)

    背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包“不亦乐乎”...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一个,干嘛不用持续集成 ...

  4. Visual Studio Package 插件开发之自动生成实体工具

    前言 这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到[生成实体]心里可能会暗想,T4模板都可以做了.动软不是已经做了么.不就是读库保存文件到指定路径么…… 我希望做 ...

  5. Visual Studio Package 插件开发之自动生成实体工具(Visual Studio SDK)

    前言 这一篇是VS插件基于Visual Studio SDK扩展开发的,可能有些朋友看到[生成实体]心里可能会暗想,T4模板都可以做了.动软不是已经做了么.不就是读库保存文件到指定路径么…… 我希望做 ...

  6. Visual Studio Code扩展

    Visual Studio Code扩展 注:本文提到的代码示例下载地址>How to create a simple extension for VS Code VS Code 是微软推出的一 ...

  7. visual Studio 2017 扩展开发(一)《向Visual Studio菜单栏新增一个菜单》

    最近有接触到关于visual studio 2017 扩展的开发,特此记录,也是为了督促自己去深入了解其原理. 开始开发Visual Studio 扩展,在这里我安装了visual studio 20 ...

  8. DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版及制作Visual Studio C#项目模板文件详解

    关于 DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版-------------- ...

  9. Visual Studio Team Services Demo Generator简介

    Visual Studio Team Services Demo Generator简介 Visual Studio Team Services Demo Generator能够帮助我们在Visual ...

随机推荐

  1. 决策树之CART算法

    顾名思义,CART算法(classification and regression tree)分类和回归算法,是一种应用广泛的决策树学习方法,既然是一种决策树学习方法,必然也满足决策树的几大步骤,即: ...

  2. CentOS 6.3安装配置LAMP服务器(Linux+Apache+MySQL+PHP5)

    服务器系统环境:CentOS 6.3 客户端系统环境:Windows 7 ultimate(x86)sp1 简体中文旗舰版 ※  本文档描述了如何在Linux服务器配置Apache.Mysql.PHP ...

  3. fisheye在centos上的安装

    目录 描述 部署过程 安装及配置 破解 添加存贮库 在jira上配置 描述 Fisheye 一个源代码库深度查看软件,它可以挖掘源代码库中的有用信息,呈现在Web浏览器界面上. Crucible是一个 ...

  4. edp 基于node.js和npm的前端开发平台

    edp能做什么? 简洁的项目创建及包管理,多种工具进行本地调试,快速项目构建及代码检测,可扩展插件... 1. 安装 $ npm install -g edp 2. 包管理-导入依赖包 >edp ...

  5. Android社会化分享功能的实现步骤

    众所周知,互联网是一个资源共享的地方,在网络上,我们可以分享我们所有认为好的资源.而随着互联网信息爆发式的增长,我们习惯了一键分享功能,比如:微博分享.微信分享.QQ空间分享.人人网分享等等.由此可见 ...

  6. LeetCode -- Product of Array Except Self My Submissions Question

    Question: Given an array of n integers where n > 1, nums, return an array output such that output ...

  7. [bzoj5472] 数列

    Description 输入一个长度为n的数组{ai}(1 <= i <= n) 问有多少个长度为n的数组{xi}(1 <= i <= n),满足1 <= xi < ...

  8. [codeforces934E]A Colourful Prospect

    [codeforces934E]A Colourful Prospect 试题描述 Firecrackers scare Nian the monster, but they're wayyyyy t ...

  9. html状态码

    100——客户必须继续发出请求101——客户要求服务器根据请求转换HTTP协议版本 200——交易成功201——提示知道新文件的URL202——接受和处理.但处理未完成203——返回信息不确定或不完整 ...

  10. python module :shelve

    shelve 是一个 key-value 的数据库. 操作方法和字典几乎一致. shelve 模块功能:以 key - value 的方式存储数据. 写数据 >>> import s ...