vsct文件在vs package中有着重关重要的作用,它是代表Visual Studio的命令表(Command Table),Visual Studio利用vsct文件的定义为我们的package的命令创建用户界面。如果你查看这个文件的属性的话,你会发现该文件的Build Action是VSCTCompile。在package编译过程中,vsct文件会被编译成二进制的资源,并以ResourceName作为资源ID添加到XXXXXXXXXXXXsx资源文件中。
正常情况下在创建项目过程中如果在“Select VSPackage Options”步骤时选了“Menu Command、Tool Window、Customer Editor”中的任意一项,那么项目生成时将会自动生成vsct文件。如果你创建的是一个空项目,这三项都没有选择那么又如何创建vsct文件呢?
1、在vs中创建任意名称的.vsct件。例:“vspackage.vsct”
2、打开package.cs文件,定义资源标记
[ProvideMenuResource("Menus.ctmenu", 1)] public sealed class CodeGeneratorPackage : Package
3、用记事本打开项目的.csproj文件
找到
<Content Include="vspackage.vsct" /> //不同vs版本可能会有所不同,可以直接搜索文件名
改为
<VSCTCompile Include="vspackage.vsct">
<ResourceName>Menus.ctmenu</ResourceName> //ResourceName可以随便定义,但要与package.cs文件中引用的一至
</VSCTCompile>
4、重新打开项目并编译
首先我们使用向导生成一个package的扩展,里面就会发现一个vsct文件。vsct文件的全称是Visual Studio Command Table,它其实就是一个xml文件,通过一定的规则来描述visual Studio的command布局。
添加一个菜单项:
首先我们在vsct文件你们加一个菜单项:
<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="XXXXXXXXXXXXXXXXXXXXXXXXXXXX/VisualStudio/2005-10-18/CommandTable" xmlns:xs="XXXXXXXXXXXXXXXXX/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="XXXXXXXXXXXXXXXXXXXXXXXXXXXX/VisualStudio/2005-10-18/CommandTable" xmlns:xs="XXXXXXXXXXXXXXXXX/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="XXXXXXXXXXXXXXXXXXXXXXXXXXXX/VisualStudio/2005-10-18/CommandTable" xmlns:xs="XXXXXXXXXXXXXXXXX/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="XXXXXXXXXXXXXXXXXXXXXXXXXXXX/VisualStudio/2005-10-18/CommandTable" xmlns:xs="XXXXXXXXXXXXXXXXX/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\XXXXXXXXXg" 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) => XXXXXXXXXXXXXXXXXrms.MessageBox.Show("hello world"), menuCommandID);
XXXXXXdCommand(menuItem);
}
}
XXXXXXXXXXXXXXXXXXXXXXX/lswweb/p/XXXXXXXXXXml
XXXXXXXXXXXXXXXXXXXXXXX/TianFang/p/XXXXXXXXXXml
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |