自定义 Office 2010 中的上下文菜单
**摘要:**自定义 Microsoft Office Fluent 用户界面中上下文菜单的功能是开发人员频繁请求的一种功能。了解有关如何自定义上下文菜单的更多信息并查看更新 Microsoft Word 2010 中现有上下文菜单的示例。
上次修改时间: 2015年4月24日
Microsoft Corporation 的 Frank Rice
2009 年 11 月
适用范围: Excel 2010 | Office 2007 | Office 2010 | Open XML | PowerPoint 2010 | SharePoint Server 2010 | VBA | Word 2010
内容
介绍 Microsoft Office 2010 中的上下文菜单
自定义上下文菜单的功能和限制
自定义上下文菜单示例
结论
其他资源
介绍 Microsoft Office 2010 中的上下文菜单
在发布 Microsoft Office 2010 之前,自定义 Microsoft Office Fluent 功能区用户界面 (UI) 中上下文(右键单击)菜单的唯一方法是使用 CommandBars 解决方案。在 Office 2010 中,您可以像自定义功能区 UI 的其他组件一样自定义内置上下文菜单。此基于 XML 的上下文菜单扩展性模型基于熟悉的功能区扩展性模型。这意味着,您可以使用当前用于自定义功能区 UI 的相同 XML 标记和回调。另外,通过功能区 UI 扩展性自定义上下文菜单不会"破坏"以前编写的命令栏解决方案。与您已熟悉的功能区 UI 扩展性方案类似,您可以通过更新 Office Open XML 格式文件或通过使用在 Microsoft Visual Studio 中创建的加载项来自定义上下文菜单。
备注
有关如何自定义功能区 UI 的详细信息,请参阅以自定义 2007 Office Fluent 功能区(针对开发人员)(该链接可能指向英文页面)开头的包含三部分的系列文章
自定义上下文菜单的功能和限制
通过功能区扩展性自定义上下文菜单时可使用许多方法,其中包括:
可以将内置控件和自定义控件(功能区菜单控件当前支持的那些类型)添加到内置上下文菜单中,如下所示:
将控件添加到菜单中的任意位置。
将控件添加到任意子菜单中。
将自定义子菜单添加到内置上下文菜单中。
隐藏内置菜单中的控件。
在任意上下文菜单项之前或之后添加菜单分隔符。
可以使用 dynamicMenu 控件动态填充(展开子菜单时)自定义子菜单。
还可以动态填充上下文菜单上显示的自定义剪辑库。
下面是自定义上下文菜单时不可用的方法:
添加上下文菜单当前不支持的控件类型(例如组合框和输入)。将在下文对此进行讨论。
为内置上下文菜单控件重新分配控件标签和图标。
在内置上下文菜单和子菜单中重新排序控件。
动态填充内置上下文菜单。
自定义上下文菜单示例
您可以使用用于自定义功能区 UI 的许多相同命令和控件来自定义上下文菜单。下面列出了上下文菜单中允许使用的控件:
控件
按钮
复选框
dynamicMenu
剪辑库
菜单
menuSeparator
splitButton
toggleButton
若要了解上下文菜单扩展性的工作原理,请查看下面的示例。此示例修改 Microsoft Word 2010 中显示的"文本"上下文菜单,并执行以下操作:
隐藏内置"字体"按钮
添加切换按钮
在"超链接"按钮之前插入新按钮
插入分隔条
添加带按钮的菜单
添加剪辑库控件
添加具有一个按钮和一个子菜单的动态菜单(在运行时创建)
在下面的过程中,将添加自定义 Word 2010 中"文本"上下文菜单的 XML 标记。可以使用 Office 2010 自定义用户界面编辑器轻松地将自定义 XML 添加到文档中,但请注意,此标记也可用于 COM 加载项。自定义用户界面编辑器是 Microsoft Office 用户体验团队的 Trang Luu 创建的一种免费工具,可从 OPENXMLDeveloper.org(该链接可能指向英文页面) 获取此工具。将在下面的步骤中使用此工具。
将 XML 标记添加到 Word 2010 文档中
启动 Word 2010。
将文本添加到文档中。在文档正文中,键入 =rand(5, 5)。此语句向文档中添加五个段落,每个段落包含五句随机文本
将文档另存为启用宏的名为 TestDocument.docm 的文件,然后关闭该文件。
启动 Office 2010 自定义用户界面编辑器,然后在"文件"菜单上,单击"打开"。
导航到您创建的测试文档,然后单击"打开"。
在左窗格中右键单击文件名,然后单击"插入 Office 2010 自定义 UI 部件",如图 1 中所示。这会将 customUI14.xml 部件添加到文档中。
图 1. 使用自定义用户界面编辑器将 Office 2010 部件插入文档中
在右窗格中,插入下面的 XML 标记:
<customUI xmlns="https://schemas.microsoft.com/office/2009/07/customui"> <contextMenus> <contextMenu idMso="ContextMenuText"> <button idMso="FontDialog" visible="false" /> <toggleButton id="MyToggle" label="My Toggle Button" /> <button id="MyButton" label="My Button" insertBeforeMso="HyperlinkInsert" onAction="GetButtonID" /> <menuSeparator id="MySeparator" /> <menu id="MySubMenu" label="My Submenu" > <button id="MyButton2" label="Button on submenu" /> </menu> <gallery id="galleryOne" label="My Gallery"> <item id="item1" imageMso="HappyFace" /> <item id="item2" imageMso="HappyFace" /> <item id="item3" imageMso="HappyFace" /> <item id="item4" imageMso="HappyFace" /> </gallery> <dynamicMenu id="MyDynamicMenu" label= "My Dynamic Menu" getContent="GetMyContent" /> </contextMenu> </contextMenus> </customUI>
此 XML 将控件添加到 <contextMenu> 标记的 idMso="ContextMenuText" 属性设置所表示的内置"文本"上下文菜单中。此第一个按钮将内置"字体"按钮的可见属性设置为 false,从而隐藏命令。在 toggleButton 之后,基于 insertBeforeMso="HyperlinkInsert" 设置在上下文菜单上的"超链接"按钮之前,插入第二个按钮。在 menuSeparator 条之后,添加具有单个按钮的菜单控件。接下来,添加包含四项的剪辑库控件。最后,在上下文菜单显示时,dynamicMenu 控件将调用 getContent 属性中指定的方法。正如您将看到的,此方法在运行时将其他控件返回给弹出菜单。
单击自定义用户界面编辑器上的"验证"按钮以确保标记没有任何错误。如有必要,请更正所有错误,直到标记没有错误,这时您会收到一条说明标记格式正确的消息。
保存文件并关闭编辑器。
将下面的 VBA 代码插入代码窗格中。
Sub GetButtonID(control As IRibbonControl) MsgBox ("You click the " & control.ID & " button.") End Sub Sub btnAction(control As IRibbonControl) MsgBox ("You clicked me!") End Sub
通过上下文菜单上的两个按钮调用这些方法。请注意,在每个方法中,将传递表示调用过程的控件的 IRibbonControl 对象参数。IRibbonControl 对象具有 Id 属性,用于在 GetButtonID 方法中确定调用过程的按钮。Id 属性很有用,因为它使多个控件能够调用同一方法,然后基于控件标识符执行不同的任务。
接下来,添加 Microsoft Visual Basic for Applications (VBA) 代码,以便将功能添加到您刚添加的控件中。
将 VBA 代码添加到文档中
打开您在前面的步骤中创建的 TestDocument.docm 文件。
单击"开发工具"选项卡,然后单击"Visual Basic"。这会打开 Visual Basic 编辑器。
在左窗格中,双击 ThisDocument 节点。这会显示代码窗格。
将下面的方法添加到代码窗格中。
Sub GetMyContent(control As IRibbonControl, ByRef content) Dim xmlString As String xmlString = "<menu " & _ "https://schemas.microsoft.com/office/2009/07/customui"">" xmlString = xmlString & "<button id=""btn1"" imageMso=""HappyFace"" " & _ " label=""Click Me"" onAction=""btnAction"" />" xmlString = xmlString & "<menu id=""mnu"" label=""My Dynamic Menu"" > " & _ "<button id=""btn2"" imageMso=""RecurrenceEdit"" /> " & _ "<button id=""btn3"" imageMso=""CreateReportFromWizard"" /> " & _ "</menu>" content = xmlString & "</menu>" End Sub
当上下文菜单显示时,getContent 属性中的 dynamicMenu 控件会调用此方法。其目的是返回生成菜单的 XML 标记。将实现此标记,就好像已将其硬编码为原始 XML 标记。
查看 VBA 代码,注意如前所述传递了 IRibbonControl 对象。另外,将 content 参数传入到此方法中。此参数没有指定类型,所以默认为 Variant 类型。此变量保存此方法完成时返回给 Microsoft Office 的 XML。此 XML 字符串包含菜单控件,并且必须以特定命名空间开头。每个动态菜单都必须包括此行。代码的剩余部分生成一个字符串,其中包含组成菜单的控件,在本例中,包括三个按钮。最后,注意构造的字符串被分配给了 content 变量,该变量将字符串传递回 Office 2010 以进行显示。
关闭 Visual Basic 编辑器。
突出显示一部分文本,然后单击鼠标右键来显示自定义的上下文菜单。
作为参考,图 2 显示自定义标准"文本"上下文菜单之前,该上下文菜单的外观。
图 2. 标准"文本"上下文菜单
图 3 显示您所创建的自定义"文本"上下文菜单。
图 3. 自定义"文本"上下文菜单
结论
开发人员通常依靠自定义上下文菜单来提供与上下文高度相关的、操作高效的自定义解决方案。与使用命令栏相比,通过功能区扩展性模型自定义这些上下文菜单可简化此任务。鼓励您探索使用各种控件组合在 Office 2010 解决方案中创建目标用户界面。
其他资源
若要查找有关本文中讨论的主题的详细信息,请参阅以下资源。
**致谢:**感谢编辑 Linda Cannon 在准备发布本文时所提供的帮助。