智能标记的结构

Visual Studio 2010 的 Office 开发工具提供了一个灵活的智能标记对象模型,使用此模型,可以将智能标记快速添加到 Microsoft Office Word 文档和 Microsoft Office Excel 工作簿中。 在高级情况下,您还可以创建自己的智能标记识别器,并访问存储在智能标记中的数据。

有关智能标记的更多信息,请参见智能标记概述

**适用于:**本主题中的信息适用于 Excel 2007 和 Word 2007 的文档级项目和应用程序级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能

对象模型概述

智能标记对象模型将智能标记与智能标记执行的操作分离开。 以下各节中描述了用来创建智能标记的主要对象。 有关演示如何向文档添加智能标记的代码示例,请参见如何:向 Word 文档添加智能标记如何:向 Excel 工作簿添加智能标记

智能标记

在代码中,智能标记为 Microsoft.Office.Tools.Word.SmartTagMicrosoft.Office.Tools.Excel.SmartTag 对象。 这些对象包括以下属性:

  • TermsExpressions。 这些属性包含智能标记的可识别术语。 若要指定简单的字符串,请将该字符串添加到 Terms 属性中。 若要指定复杂的字符串,请将说明该字符串的正则表达式添加到 Expressions 属性中。

  • Actions. 此属性包含用户选择该智能标记时执行的操作。

  • Caption. 此属性指定智能标记的标签。

操作

当用户选择智能标记时,该用户可以执行特定于该智能标记的一项或多项操作。 每项操作由一个 Microsoft.Office.Tools.Word.ActionMicrosoft.Office.Tools.Excel.Action 对象表示。 这些对象提供了BeforeCaptionShow 和 Click 事件:

  • BeforeCaptionShow 事件紧跟着用户单击智能标记图标之后、智能标记菜单显示之前引发。 如果要在运行时修改智能标记菜单中操作的标题,请处理此事件。

  • 用户在智能标记菜单中单击操作的标题时将引发 Click 事件。 若要在用户单击操作时运行代码,请处理此事件。

这些事件的事件处理程序接收 Microsoft.Office.Tools.Excel.ActionEventArgsMicrosoft.Office.Tools.Word.ActionEventArgs 对象,通过所接收的对象,可访问已识别的文本及此文本的位置。

创建智能标记

创建智能标记的方式取决于项目面向的是 .NET Framework 3.5 还是 .NET Framework 4。

如果面向的是 .NET Framework 3.5,则可以直接对 SmartTag 和 Action 类进行实例化。 下面的代码示例演示如何在面向 .NET Framework 3.5 的 Word 项目中创建简单智能标记。 若要使用此示例,请从文档级项目内的 ThisDocument 类或应用程序级项目内的 ThisAddIn 类中运行代码。

Dim simpleSmartTag As Microsoft.Office.Tools.Word.SmartTag =
        New Microsoft.Office.Tools.Word.SmartTag(
        "www.microsoft.com/Demo#DemoSmartTag",
        "Test Smart Tag")
Dim simpleAction As Microsoft.Office.Tools.Word.Action = 
    New Microsoft.Office.Tools.Word.Action("Test Action")

simpleSmartTag.Terms.Add("blue")
simpleSmartTag.Actions = New Microsoft.Office.Tools.Word.Action() { _
    simpleAction}
Me.VstoSmartTags.Add(simpleSmartTag)
Microsoft.Office.Tools.Word.SmartTag simpleSmartTag =
    new Microsoft.Office.Tools.Word.SmartTag(
    "www.microsoft.com/Demo#DemoSmartTag",
    "Test Smart Tag");
Microsoft.Office.Tools.Word.Action simpleAction = 
    new Microsoft.Office.Tools.Word.Action("Test Action");

simpleSmartTag.Terms.Add("blue");
simpleSmartTag.Actions = new Microsoft.Office.Tools.Word.Action[] { 
    simpleAction };
this.VstoSmartTags.Add(simpleSmartTag);

如果面向的是 .NET Framework 4,则不能直接对 SmartTag 和 Action 接口进行实例化。 而必须使用项目中的 Globals 类提供的 CreateSmartTag 和 CreateAction 方法来获取这些对象的实例。 有关 Globals 类的更多信息,请参见对 Office 项目中对象的全局访问。 下面的代码示例演示如何在面向 .NET Framework 4 的 Word 项目中创建简单智能标记。 若要使用此示例,请从文档级项目内的 ThisDocument 类或应用程序级项目内的 ThisAddIn 类中运行代码。

Dim simpleSmartTag As Microsoft.Office.Tools.Word.SmartTag =
    Globals.Factory.CreateSmartTag(
        "www.microsoft.com/Demo#DemoSmartTag",
        "Test Smart Tag")
Dim simpleAction As Microsoft.Office.Tools.Word.Action =
    Globals.Factory.CreateAction("Test Action")

simpleSmartTag.Terms.Add("blue")
simpleSmartTag.Actions = New Microsoft.Office.Tools.Word.Action() { _
    simpleAction}
Me.VstoSmartTags.Add(simpleSmartTag)
Microsoft.Office.Tools.Word.SmartTag simpleSmartTag =
    Globals.Factory.CreateSmartTag(
    "www.microsoft.com/Demo#DemoSmartTag",
    "Test Smart Tag");
Microsoft.Office.Tools.Word.Action simpleAction =
    Globals.Factory.CreateAction("Test Action");

simpleSmartTag.Terms.Add("blue");
simpleSmartTag.Actions = new Microsoft.Office.Tools.Word.Action[] { 
    simpleAction };
this.VstoSmartTags.Add(simpleSmartTag);

有关进一步的说明和演示更复杂智能标记的代码示例,请参见如何:向 Word 文档添加智能标记如何:向 Excel 工作簿添加智能标记

创建智能标记识别器

如果要自定义默认的智能标记识别行为,您可以创建自己的智能标记识别器。 实现此操作的方式取决于项目面向的是 .NET Framework 3.5 还是 .NET Framework 4。

默认的文本识别行为

当用户在文档或工作簿中键入文本时,Word 和 Excel 会根据该文本创建一个标记列表。 默认的智能标记识别器接收此标记列表以及用户键入的完整文本。 默认识别器在满足以下任一条件时标识智能标记:

  • Terms 属性中的一个字符串与文档或工作簿中的一个标记完全匹配。

  • Expressions 属性中的一个正则表达式与用户键入的完整文本匹配。

Word 和 Excel 在用户键入字符串时将包含嵌入空格或组合了字母、数字和符号的字符串解析为分开的标记。 例如,如果用户键入“sales report”,Word 和 Excel 会创建标记“sales”和“report”。 同样,如果用户键入“2005sales”,Word 和 Excel 会创建标记“2005”和“sales”。

如果想让智能标记识别包含嵌入空格或组合了字母、数字和符号的字符串,则不要向 Terms 属性添加字符串。 而是应该向 Expressions 属性添加说明该字符串的正则表达式,或者创建自己的用于搜索该字符串的识别器。

在面向 .NET Framework 4 的项目中创建智能标记识别器

若要创建自己的智能标记识别器,请定义一个实现 Microsoft.Office.Tools.Word.ISmartTagExtensionMicrosoft.Office.Tools.Excel.ISmartTagExtension 接口的类。 在实现 ISmartTagExtension.Recognize 方法时,需要搜索智能标记术语的文本,如果找到智能标记术语,还需要用 Word 或 Excel 注册智能标记。 若要注册智能标记,请调用 Recognize 方法的 context 参数的 PersistTag 方法。

下面的代码示例演示如何在面向 .NET Framework 4 的 Word 项目中创建具有自定义识别器的简单智能标记类。

Public Class SmartTagWithCustomRecognizer
    Implements Microsoft.Office.Tools.Word.ISmartTagExtension

    Private theSmartTag As Microsoft.Office.Tools.Word.SmartTag

    Public Sub New()
        theSmartTag = Globals.Factory.CreateSmartTag("www.microsoft.com/Demo#DemoSmartTag",
            "Test Smart Tag", Me)
        Dim simpleAction As Microsoft.Office.Tools.Word.Action = Globals.Factory.CreateAction("Test Action")
        theSmartTag.Actions = New Microsoft.Office.Tools.Word.Action() {simpleAction}
    End Sub

    Private Sub Recognize(ByVal text As String,
        ByVal site As Microsoft.Office.Interop.SmartTag.ISmartTagRecognizerSite,
        ByVal tokenList As Microsoft.Office.Interop.SmartTag.ISmartTagTokenList,
        ByVal context As Microsoft.Office.Tools.Word.SmartTagRecognizeContext) _
        Implements Microsoft.Office.Tools.Word.ISmartTagExtension.Recognize

        Dim index As Integer = text.IndexOf("blue")
        If index >= 0 Then
            context.PersistTag(index, 4, Nothing)
        End If
    End Sub

    Public ReadOnly Property ExtensionBase() As Object _
        Implements Microsoft.Office.Tools.Word.ISmartTagExtension.ExtensionBase
        Get
            Return theSmartTag
        End Get
    End Property
End Class
public class SmartTagWithCustomRecognizer : Microsoft.Office.Tools.Word.ISmartTagExtension
{
    private Microsoft.Office.Tools.Word.SmartTag theSmartTag;

    public SmartTagWithCustomRecognizer()
    {
        theSmartTag = Globals.Factory.CreateSmartTag("www.microsoft.com/Demo#DemoSmartTag", 
            "Test Smart Tag", this);
        Microsoft.Office.Tools.Word.Action simpleAction = Globals.Factory.CreateAction("Test Action");
        theSmartTag.Actions = new Microsoft.Office.Tools.Word.Action[] { simpleAction };
    }

    public void Recognize(string text, Microsoft.Office.Interop.SmartTag.ISmartTagRecognizerSite site, 
        Microsoft.Office.Interop.SmartTag.ISmartTagTokenList tokenList,
        Microsoft.Office.Tools.Word.SmartTagRecognizeContext context)
    {
        int index = text.IndexOf("blue");
        if (index >= 0)
        {
            context.PersistTag(index, 4, null);
        }
    }

    public object ExtensionBase
    {
        get { return theSmartTag; }
    }
}

有关进一步的说明和演示具有自定义识别器的更复杂智能标记类的代码示例,请参见如何:在 Word 和 .NET Framework 4 中使用自定义识别器创建智能标记如何:在 Excel 和 .NET Framework 4 中使用自定义识别器创建智能标记

在面向 .NET Framework 3.5 的项目中创建智能标记识别器

若要创建自己的智能标记识别器,请从 Microsoft.Office.Tools.Word.SmartTagMicrosoft.Office.Tools.Excel.SmartTag 派生一个类,然后重写该类中的 SmartTag.Recognize 方法。 在方法中,搜索智能标记术语的文本,如果找到智能标记术语,还需要用 Word 或 Excel 注册智能标记。 若要注册智能标记,请调用类从 Microsoft.Office.Tools.Word.SmartTagMicrosoft.Office.Tools.Excel.SmartTag 派生的 PersistTag 方法。

下面的代码示例演示如何在面向 .NET Framework 3.5 的 Word 项目中创建具有自定义识别器的简单智能标记类。

Public Class SmartTagWithCustomRecognizer 
    Inherits Microsoft.Office.Tools.Word.SmartTag

    Public Sub New()
    MyBase.New("https://www.contoso.com/Demo#DemoSmartTag", _
        "Test Smart Tag")
        Dim simpleAction As Microsoft.Office.Tools.Word.Action = _
            New Microsoft.Office.Tools.Word.Action("TestAction")
        Me.Actions = new Microsoft.Office.Tools.Word.Action() { simpleAction }
    End Sub

    Protected Overrides Sub Recognize(ByVal text As String, _
        ByVal site As Microsoft.Office.Interop.SmartTag.ISmartTagRecognizerSite, _
        ByVal tokenList As Microsoft.Office.Interop.SmartTag.ISmartTagTokenList)

        Dim index As Integer = text.IndexOf("blue")
        If index >= 0 Then
            Me.PersistTag(index, 4, Nothing)
        End If
    End Sub
End Class
public class SmartTagWithCustomRecognizer : Microsoft.Office.Tools.Word.SmartTag
{
    public SmartTagWithCustomRecognizer() : base(
        "https://www.contoso.com/Demo#DemoSmartTag", 
        "Test Smart Tag")
    {
        Microsoft.Office.Tools.Word.Action simpleAction = 
            new Microsoft.Office.Tools.Word.Action("TestAction");
        this.Actions = new Microsoft.Office.Tools.Word.Action[] { simpleAction };
    }

    protected override void Recognize(string text, 
        Microsoft.Office.Interop.SmartTag.ISmartTagRecognizerSite site, 
        Microsoft.Office.Interop.SmartTag.ISmartTagTokenList tokenList)
    {
        int index = text.IndexOf("blue");
        if (index >= 0)
        {
            this.PersistTag(index, 4, null);
        }
    }
}

有关进一步的说明和演示具有自定义识别器的更复杂智能标记类的代码示例,请参见如何:在 Word 和 .NET Framework 3.5 中使用自定义识别器创建智能标记如何:在 Excel 和 .NET Framework 3.5 中使用自定义识别器创建智能标记

存储和检索属性包中的数据

智能标记可以在键/值对集合(称为属性包)中存储数据。 属性包中的每个值和键都是一个字符串。

可以通过两种方法访问属性包:

  • 您可以处理 Microsoft.Office.Tools.Word.ActionMicrosoft.Office.Tools.Excel.Action 对象的 Click 或 BeforeCaptionShow 事件,并可以使用事件实参形参的 Properties 属性向智能标记的属性包中写入内容以及从中读取内容。 Properties 属性返回 ISmartTagProperties 对象。 当您向项目中添加对 Microsoft Smart Tags 2.0 类型库的引用时,ISmartTagProperties 接口可用。

  • 您可以按照上面的说明创建自定义智能标记识别器。 在实现或重写 Recognize 方法时,请使用 site 参数的 GetNewPropertyBag 方法获取 ISmartTagProperties 对象,您可以使用此对象来向智能标记的属性包中写入内容以及从中读取内容。

有关如何向属性包中写入内容以及从中读取内容的示例,请参见下列主题:

正则表达式和属性包

当您将正则表达式分配给智能标记时,默认的识别器会将正则表达式中的每个捕获组的键/值对添加到智能标记的属性包。

有关演示此行为的示例,请参见 演练:使用文档级自定义项创建智能标记。 有关正则表达式中的捕获组的更多信息,请参见分组构造正则表达式对象模型

请参见

任务

如何:在 Word 和 Excel 中启用智能标记

如何:向 Word 文档添加智能标记

如何:向 Excel 工作簿添加智能标记

如何:在 Word 和 .NET Framework 3.5 中使用自定义识别器创建智能标记

如何:在 Excel 和 .NET Framework 3.5 中使用自定义识别器创建智能标记

演练:使用文档级自定义项创建智能标记

演练:使用应用程序级外接程序创建智能标记

其他资源

智能标记概述