本演练演示如何在 Word 的文档级自定义项中创建 Bookmark 控件的快捷菜单。用户右击书签中的文本时,将出现一个快捷菜单,它为用户提供用于设置文本格式的选项。
**适用于:**本主题中的信息适用于 Word 2013 和 Word 2010 的文档级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能。
本演练阐释了以下任务:
创建项目.
向文档中添加文本和书签.
将命令添加到快捷菜单.
设置书签中文本的格式.
![]() |
---|
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置。 |
系统必备
您需要以下组件来完成本演练:
-
Visual Studio 2012 的一个版本,其中包含 Microsoft Office 开发工具。有关更多信息,请参见[将计算机配置为开发 Office 解决方案](bb398242\(v=vs.110\).md)。
- Word 2013 或 Word 2010
创建项目
第一步是在 Visual Studio 中创建 Word 文档项目。
创建新项目
创建一个名为“我的书签快捷菜单”的 Word 文档项目。在向导中,选择**“创建新文档”**。有关更多信息,请参见如何:在 Visual Studio 中创建 Office 项目。
Visual Studio 将在设计器中打开一个新的 Word 文档,并将**“我的书签快捷菜单”项目添加到“解决方案资源管理器”**中。
向文档中添加文本和书签
向文档中添加一些文本,然后添加两个重叠书签。
向文档中添加文本
中显示您的项目设计器的文档,请键入以下文本。
这是一个示例,将演示如何创建一个在右击书签中的文本时出现的快捷菜单。
向文档中添加 Bookmark 控件
在 工具箱,从 Word 控件 选项,则的一个 Bookmark 添加宿主控件拖动。
将出现**“添加书签控件”**对话框。
选择“创建快捷菜单的单词,当您右击该文本”,则单击 确定。
bookmark1 便被添加到文档中。
添加另一个 Bookmark 控件添加到文字“中右击书签中的文本”。
bookmark2 便被添加到文档中。
说明
运行“右击该文本”在 bookmark1 和 bookmark2。
在设计时向文档中添加书签时,将创建一个 Bookmark 控件。可以对一些书签事件进行编程。可以在书签的 BeforeRightClick 事件中编写代码,以便在用户右击书签中的文本时出现一个快捷菜单。
将命令添加到快捷菜单
将按钮添加到显示的快捷菜单,当您右击文档。
将命令添加到快捷菜单
添加一个 功能区 XML 项添加到项目中。有关更多信息,请参见如何:开始自定义功能区。
在 解决方案资源管理器,选择 ThisDocument.cs 或 ThisDocument.vb。
在菜单栏上,依次选择 视图,代码。
ThisDocument 选件类文件将在代码编辑器中打开。
将以下代码添加到 ThisDocument 选件类。这段代码重写 CreateRibbonExtensibilityObject 方法,将功能区 XML 类返回给 Office 应用程序。
Protected Overrides Function CreateRibbonExtensibilityObject() As Microsoft.Office.Core.IRibbonExtensibility Return New Ribbon1() End Function
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() { return new Ribbon1(); }
在 解决方案资源管理器,选择功能区 XML 文件。默认情况下,功能区 XML 文件名为 Ribbon1.xml。
在菜单栏上,依次选择 视图,代码。
功能区 XML 文件将在代码编辑器中打开。
在代码编辑器中,用以下代码替换功能区 XML 文件的内容。
<?xml version="1.0" encoding="UTF-8"?> <customUI xmlns="https://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load"> <contextMenus> <contextMenu idMso="ContextMenuText"> <button id="BoldButton" label="Bold" onAction="ButtonClick" getVisible="GetVisible" /> <button id="ItalicButton" label="Italic" onAction="ButtonClick" getVisible="GetVisible"/> </contextMenu> </contextMenus> </customUI>
此代码添加两个按钮。显示的快捷菜单,当您右击文档。
在**“解决方案资源管理器”中,右击 ThisDocument,然后单击“查看代码”**。
声明以下变量和书签变量在选件类级别。
Public selectedBookmark As Microsoft.Office.Tools.Word.Bookmark Public ShowBoldButton As String = False Public ShowItalicButton As String = False Public WordTrue As Integer = -1 Public WordFalse As Integer = 0
public Microsoft.Office.Tools.Word.Bookmark selectedBookmark; public bool showBoldButton = false; public bool showItalicButton = false; public int WordTrue = -1; public int WordFalse = 0;
在 解决方案资源管理器,选择功能区代码文件。默认情况下,功能区代码文件名为 Ribbon1.cs 或 Ribbon1.vb。
在菜单栏上,依次选择 视图,代码。
功能区代码文件会在代码编辑器中打开。
在功能区代码文件中,添加以下方法。这是添加到文档的快捷菜单的两个按钮的回调方法。此方法确定这些按钮是否显示在快捷菜单。仅当您右击在书签中,的文本以粗体和斜体的按钮显示。
Public Function GetVisible(ByVal control As Office.IRibbonControl) As Boolean If control.Id = "BoldButton" Then If Globals.ThisDocument.ShowBoldButton = True Then Globals.ThisDocument.ShowBoldButton = False Return True Else Return False End If ElseIf control.Id = "ItalicButton" Then If Globals.ThisDocument.ShowItalicButton = True Then Globals.ThisDocument.ShowItalicButton = False Return True Else Return False End If Else Return False End If End Function
public bool GetVisible(Office.IRibbonControl control) { if (control.Id == "BoldButton") { if (Globals.ThisDocument.showBoldButton == true) { Globals.ThisDocument.showBoldButton = false; return true; } else { return false; } } else if (control.Id == "ItalicButton") { if (Globals.ThisDocument.showItalicButton == true) { Globals.ThisDocument.showItalicButton = false; return true; } else { return false; } } else { return false; } }
设置书签中文本的格式
在功能区代码文件中,添加一个 ButtonClick 事件处理程序将格式应用于书签。
Public Sub ButtonClick(ByVal control As Office.IRibbonControl) If control.Id = "BoldButton" Then If Globals.ThisDocument.selectedBookmark.Bold = _ Globals.ThisDocument.WordTrue Then Globals.ThisDocument.selectedBookmark.Bold = _ Globals.ThisDocument.WordFalse Else Globals.ThisDocument.selectedBookmark.Bold = _ Globals.ThisDocument.WordTrue End If ElseIf control.Id = "ItalicButton" Then If Globals.ThisDocument.selectedBookmark.Italic = _ Globals.ThisDocument.WordTrue Then Globals.ThisDocument.selectedBookmark.Italic = _ Globals.ThisDocument.WordFalse Else Globals.ThisDocument.selectedBookmark.Italic = _ Globals.ThisDocument.WordTrue End If End If End Sub
public void ButtonClick(Office.IRibbonControl control) { if (control.Id == "BoldButton") { if (Globals.ThisDocument.selectedBookmark.Bold == Globals.ThisDocument.WordTrue) { Globals.ThisDocument.selectedBookmark.Bold = Globals.ThisDocument.WordFalse; } else { Globals.ThisDocument.selectedBookmark.Bold = Globals.ThisDocument.WordTrue; } } else if (control.Id == "ItalicButton") { if (Globals.ThisDocument.selectedBookmark.Italic == Globals.ThisDocument.WordTrue) { Globals.ThisDocument.selectedBookmark.Italic = Globals.ThisDocument.WordFalse; } else { Globals.ThisDocument.selectedBookmark.Italic = Globals.ThisDocument.WordTrue; } } }
解决方案资源管理器、选择 ThisDocument.cs 或 ThisDocument.vb。
在菜单栏上,依次选择 视图,代码。
ThisDocument 选件类文件将在代码编辑器中打开。
将以下代码添加到 ThisDocument 选件类。
Private Sub Bookmark_BeforeRightClick(ByVal sender As Object, ByVal e _ As Microsoft.Office.Tools.Word.ClickEventArgs) _ Handles Bookmark1.BeforeRightClick, Bookmark2.BeforeRightClick Dim startPosition As Integer = 0 Dim i As Integer ' If bookmarks overlap, get bookmark closest to cursor. For i = 1 To e.Selection.Bookmarks.Count If e.Selection.Bookmarks(i).Start > startPosition Then startPosition = e.Selection.Bookmarks(i).Start End If Next ' If closest bookmark is the sender, show the shortcut menu options. If DirectCast(sender, Microsoft.Office.Tools.Word.Bookmark).Start = _ startPosition Then selectedBookmark = DirectCast(sender, Microsoft.Office.Tools.Word.Bookmark) ShowBoldButton = True ShowItalicButton = True End If End Sub
void bookmark_BeforeRightClick(object sender, ClickEventArgs e) { int startPosition = 0; // If bookmarks overlap, get bookmark closest to cursor. for (int i = 1; i <= e.Selection.Bookmarks.Count; i++) { if (e.Selection.Bookmarks[i].Start > startPosition) { startPosition = e.Selection.Bookmarks[i].Start; } } // If closest bookmark is the sender, show shortcut menu options. if (((Microsoft.Office.Tools.Word.Bookmark)sender).Start == startPosition) { selectedBookmark = (Microsoft.Office.Tools.Word.Bookmark)sender; showBoldButton = true; showItalicButton = true; } }
说明
必须编写代码来处理书签重叠的情况。否则,默认情况下将为所选内容中的所有书签调用代码。
在 C# 中,必须将书签控件的事件处理程序添加到 Startup 事件。有关创建事件处理程序的信息,请参见如何:在 Office 项目中创建事件处理程序。
private void ThisDocument_Startup(object sender, System.EventArgs e) { this.bookmark1.BeforeRightClick += new ClickEventHandler(bookmark_BeforeRightClick); this.bookmark2.BeforeRightClick += new ClickEventHandler(bookmark_BeforeRightClick); }
测试应用程序
测试文档验证粗体和斜体的菜单项显示在快捷菜单上,在中右击书签中的文本,并且文本格式正确。
测试文档
按 F5 运行项目。
右击第一个书签,然后单击**“粗体”**。
验证 bookmark1 中的所有文本是否都已设置为粗体格式。
右击书签重叠处的文本,然后单击**“斜体”**。
验证 bookmark2 中的所有文本是否为斜体,并验证与 bookmark2 重叠的 bookmark1 中是否只有部分文本为斜体。
后续步骤
下一步可能要执行以下几项任务:
编写代码以响应 Excel 中的宿主控件事件。有关更多信息,请参见演练:根据 NamedRange 控件的事件进行编程。
使用复选框更改书签中的格式设置。有关更多信息,请参见演练:使用 CheckBox 控件更改文档格式设置。