演练:创建书签的快捷菜单

本演练演示如何在 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 控件

  1. 工具箱,从 Word 控件 选项,则的一个 Bookmark 添加宿主控件拖动。

    将出现**“添加书签控件”**对话框。

  2. 选择“创建快捷菜单的单词,当您右击该文本”,则单击 确定

    bookmark1 便被添加到文档中。

  3. 添加另一个 Bookmark 控件添加到文字“中右击书签中的文本”。

    bookmark2 便被添加到文档中。

    说明说明

    运行“右击该文本”在 bookmark1 和 bookmark2。

在设计时向文档中添加书签时,将创建一个 Bookmark 控件。可以对一些书签事件进行编程。可以在书签的 BeforeRightClick 事件中编写代码,以便在用户右击书签中的文本时出现一个快捷菜单。

将命令添加到快捷菜单

将按钮添加到显示的快捷菜单,当您右击文档。

将命令添加到快捷菜单

  1. 添加一个 功能区 XML 项添加到项目中。有关更多信息,请参见如何:开始自定义功能区

  2. 解决方案资源管理器,选择 ThisDocument.csThisDocument.vb

  3. 在菜单栏上,依次选择 视图代码

    ThisDocument 选件类文件将在代码编辑器中打开。

  4. 将以下代码添加到 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();
    }
    
  5. 解决方案资源管理器,选择功能区 XML 文件。默认情况下,功能区 XML 文件名为 Ribbon1.xml。

  6. 在菜单栏上,依次选择 视图代码

    功能区 XML 文件将在代码编辑器中打开。

  7. 在代码编辑器中,用以下代码替换功能区 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>
    

    此代码添加两个按钮。显示的快捷菜单,当您右击文档。

  8. 在**“解决方案资源管理器”中,右击 ThisDocument,然后单击“查看代码”**。

  9. 声明以下变量和书签变量在选件类级别。

    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;
    
    
  10. 解决方案资源管理器,选择功能区代码文件。默认情况下,功能区代码文件名为 Ribbon1.csRibbon1.vb

  11. 在菜单栏上,依次选择 视图代码

    功能区代码文件会在代码编辑器中打开。

  12. 在功能区代码文件中,添加以下方法。这是添加到文档的快捷菜单的两个按钮的回调方法。此方法确定这些按钮是否显示在快捷菜单。仅当您右击在书签中,的文本以粗体和斜体的按钮显示。

    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;
               }
    
           }
    
    

设置书签中文本的格式

  1. 在功能区代码文件中,添加一个 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;
            }
        }
    
    }
    
  2. 解决方案资源管理器、选择 ThisDocument.csThisDocument.vb

  3. 在菜单栏上,依次选择 视图代码

    ThisDocument 选件类文件将在代码编辑器中打开。

  4. 将以下代码添加到 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;
    
                }
    
            }
    
    
    说明说明

    必须编写代码来处理书签重叠的情况。否则,默认情况下将为所选内容中的所有书签调用代码。

  5. 在 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);
    }
    

测试应用程序

测试文档验证粗体和斜体的菜单项显示在快捷菜单上,在中右击书签中的文本,并且文本格式正确。

测试文档

  1. 按 F5 运行项目。

  2. 右击第一个书签,然后单击**“粗体”**。

  3. 验证 bookmark1 中的所有文本是否都已设置为粗体格式。

  4. 右击书签重叠处的文本,然后单击**“斜体”**。

  5. 验证 bookmark2 中的所有文本是否为斜体,并验证与 bookmark2 重叠的 bookmark1 中是否只有部分文本为斜体。

后续步骤

下一步可能要执行以下几项任务:

请参见

概念

使用 Word 的演练

使用扩展对象实现 Word 自动化

Bookmark 控件

Office 解决方案中的可选参数

其他资源

Office UI 自定义