在演示的本演练生成在 演练:将子菜单添加到菜单和演示如何以动态列表发送到子菜单。 动态用于创建最近使用的基类型列表 (MRU)的表格形式。
动态菜单列表占位符首的菜单。 在菜单上显示时, Visual Studio 集成开发环境 (IDE) (ide) 请求 VSPackage 应显示在一个占位符的所有命令。 动态中的任意位置菜单列表会发生此错误。 但是,动态列表通常存储并仅显示在子菜单或在菜单的底部。 通过使用这些设计模式,启用动态列表命令展开和收缩,而不影响其他命令的位置在菜单上。 在本演练中,动态 MRU 列表显示在现有子菜单的底部,分隔从子菜单的其余部分。行。
在技术上,动态列表可应用于工具栏。 但是,我们不鼓励该用法,因为工具栏应保持不变,除非该用户执行特定步骤以更改它。
本演练创建 MRU 每次更改其顺序的列表四个项目其中一个被选定 (选定项移动到列表的顶部)。
有关菜单和 .vsct 文件的更多信息,请参见 命令、菜单和工具栏。
系统必备
若要完成本演练,您必须安装 Visual Studio 2010 SDK。
备注
有关 Visual Studio SDK 的更多信息,请参见 扩展 Visual Studio 概述。若要查找有关中所列如何下载 Visual Studio SDK,请 Visual Studio Extensibility Developer Center 参见 MSDN 网站上。
Visual Studio 包 " 项目模板的位置
Visual Studio 包 " 项目模板可在 新项目 对话框的三个位置:
在 Visual Basic 扩展性下。 该项的默认语言是 Visual Basic。
在 C# 扩展性下。 该项目的默认语言是 C#。
在 其他项目类型扩展性下。 该项的默认语言是 C++。
创建 VSPackage
创建 TopLevelMenu VSPackage
- 按照 演练:将子菜单添加到菜单 的过程创建以下过程中修改的子菜单。
在本演练中的过程假定, VSPackage 的名称为 TopLevelMenu,是名称用于 演练:添加菜单到 Visual Studio 菜单栏 (c#)。
创建动态项列表命令
若要创建动态项列表命令
打开 TopLevelMenu.vsct。
在 Symbols 部分,在名为 guidTopLevelMenuCmdSet 的 GuidSymbol 节点,添加 MRUListGroup 组和 cmdidMRUList 命令的符号,如下所示。
在 Groups 部分,请在现有组项之后添加声明的组。
在 Buttons 节中,添加一个节点在现有按钮项之后表示最近声明的命令,。
<Button guid="guidTopLevelMenuCmdSet" id="cmdidMRUList" type="Button" priority="0x0100"> <Parent guid="guidTopLevelMenuCmdSet" id="MRUListGroup" /> <CommandFlag>DynamicItemStart</CommandFlag> <Strings> <CommandName>cmdidMRUList</CommandName> <ButtonText>MRU Placeholder</ButtonText> </Strings> </Button>
DynamicItemStart 标志启用命令动态生成。
在 生成 菜单上,单击 生成解决方案。
执行此重新生成发生更改的 .vsct 文件。 更正在生成过程中,可能发生的所有错误。
按 F5 测试新命令的显示。
在 TestMenu 菜单上,单击新的子菜单, 子菜单,显示新命令, MRU 占位符。 在动态 MRU 在下一过程中列出命令实现,此命令标签将该替换每次后列表将为子菜单。
备注
,在继续下一节之前,必须关闭实验 Visual Studio。
加载 MRU 列表
通过使用托管代码,若要填充 MRU 列表
打开 PkgCmdID.cs 或 PkgCmdID.vb 在代码编辑器中。
在 PkgCmdIDList 类定义现有命令 ID 之后添加以下命令 ID。
public const uint cmdidMRUList = 0x200;
打开 TopLevelMenuPackage.cs 或 TopLevelMenuPackage.vb 在代码编辑器中。
在文件的顶部,在使用末尾语句列表中,添加以下语句。
using System.Collections;
查找 Initialize 方法。 您可能必须找到该隐藏的区域标记为 “包成员”并将其展开。 Initialize 方法在隐藏的区域。
为 Initialize 方法中,添加在后面的代码行最后一次调用 AddCommand 方法。 InitMRUMenu 将为未定义在步骤之后。
this.InitMRUMenu(mcs);
在 MyTopLevelMenuPackage 类的末尾,添加对于 SubItemCallback 方法的后面的代码。 此代码初始化表示在 MRU 中显示的项列表字符串的列表。
private int numMRUItems = 4; private int baseMRUID = (int)PkgCmdIDList.cmdidMRUList; private ArrayList mruList; private void InitializeMRUList() { if (null == this.mruList) { this.mruList = new ArrayList(); if (null != this.mruList) { for (int i = 0; i < this.numMRUItems; i++) { this.mruList.Add(string.Format(CultureInfo.CurrentCulture, "Item {0}", i + 1)); } } } }
在 InitializeMRUList 方法之后,添加以下 InitMRUMenu 方法。 此初始化 MRU 列表菜单命令。
private void InitMRUMenu(OleMenuCommandService mcs) { InitializeMRUList(); for (int i = 0; i < this.numMRUItems; i++) { var cmdID = new CommandID( GuidList.guidTopLevelMenuCmdSet, this.baseMRUID + i); var mc = new OleMenuCommand( new EventHandler(OnMRUExec), cmdID); mc.BeforeQueryStatus += new EventHandler(OnMRUQueryStatus); mcs.AddCommand(mc); } }
在托管代码中,可以在 MRU 必须创建每个可能的项目的菜单命令对象的列表。 IDE 对每个项的 OnMRUQueryStatus 方法在 MRU 列表,它就项目。 在托管代码中, IDE 的唯一方式了解没有更多的项目首先创建所有可能的项目。 如果需要,可以开始标记其他项为不可见使用 mc.Visible = false; ,在菜单命令创建后。 这些项可以稍后可以看到通过在 OnMRUQueryStatus 方法的 mc.Visible = true; 。
在 InitMRUMenu 方法之后,添加以下 OnMRUQueryStatus 方法。 这是将每个 MRU 项的文本的处理程序。
private void OnMRUQueryStatus(object sender, EventArgs e) { OleMenuCommand menuCommand = sender as OleMenuCommand; if (null != menuCommand) { int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID; if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count) { menuCommand.Text = this.mruList[MRUItemIndex] as string; } } }
在 OnMRUQueryStatus 方法之后,添加以下 OnMRUExec 方法。 这是选择的 MRU 项处理程序。 此方法移动选定项移动到列表的顶部然后在消息框中显示选定项。
private void OnMRUExec(object sender, EventArgs e) { var menuCommand = sender as OleMenuCommand; if (null != menuCommand) { int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID; if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count) { string selection = this.mruList[MRUItemIndex] as string; for (int i = MRUItemIndex; i > 0; i--) { this.mruList[i] = this.mruList[i - 1]; } this.mruList[0] = selection; System.Windows.Forms.MessageBox.Show( string.Format(CultureInfo.CurrentCulture, "Selected {0}", selection)); } } }
在**“生成”菜单上,单击“生成解决方案”**以生成解决方案。 更正可能发生的所有错误。
测试 MRU 列表
若要测试菜单 MRU 列表
按 F5 测试新命令的显示。
在 TestMenu 菜单上,单击 测试命令。 执行此显示一个消息框命令的部分。
备注
需要此步骤强制 VSPackage 加载,并正确显示 MRU 列表。如果跳过此步骤, MRU 列表不会显示。
在 测试菜单 菜单上,单击 替换菜单。 四个项列表显示在子菜单末尾,在分隔符下。 当您单击 project 3时,消息框将出现并显示文本, “选定项 3 "。 (如果四个项列表未显示,请确保按照前面的步骤中说明。)
再次打开该子菜单。 请注意 project 3 现在位于列表的顶部和其他项被推送到一个位置下。 再次单击 project 3 和通知消息框仍显示 “选定项 3 ",指示该文本正确移动到新位置与命令处理标签。