UI 自动化文本单位

本主题介绍 Microsoft UI 自动化 TextRange 控件模式支持的文本单位。 UI 自动化提供程序和客户端使用文本单位来指定文本范围大小移动或更改的量。

文本单位 API 元素

UI 自动化 API 包括以下需要指定文本单位的方法:

TextUnit 枚举定义 UI 自动化文本范围支持的文本单位。 若要指定文本单位,需要在对 ITextRangeProviderIUIAutomationTextRange 方法的调用中指定 TextUnit 枚举的成员。 文本单位如下所示(从最小到最大):

如果一个基于文本的具体控件不支持指定的文本单位,提供程序应会通过替代控件支持的下一个更大的文本单位来响应。 例如,如果指定了 TextUnit_Paragraph 但不支持它,则该方法可以替代 TextUnit_PageTextUnit_Document

源文本的语言特征使得提供程序很难根据指定的文本单位确定文本边界。 如果需要帮助来确定文本边界,提供程序可以使用 Uniscribe API 函数,例如 ScriptBreak。 有关详细信息,请参阅 Uniscribe

终结点包容性

文本单位终结点既可充当相同类型的相邻文本范围的开始终结点,也可以充当其结束终结点。 如果一个文本单位的结尾同时是另一个文本单位的开头,则包含结束终结点的范围不会共享包含开始终结点的相邻范围的任何属性或对象。

例如,文本流“Hello world”包含两个具有不同字体粗细属性(普通和粗体)的字词单位。 在本例中,字词单位“Hello”的结束终结点和字词单位“world”开始终结点相同,这会得到以下结果:

  • “Hello”的范围不共享字词单位“world”的粗体属性,且不返回字体粗细文本属性的混合属性值。
  • world”的范围只有一个字体粗细(粗体),不共享前一个字词单位“Hello”的字体粗细。

下面是另一个示例,其中文本流包含两个字词单位,其中一个是链接:[Foo]() Bar。 在这种情况下,字词单位 [Foo]()结束终结点和字词单位“Bar”的开始终结点相同,这会得到以下结果:

  • 该链接属于包含“Foo”的文本范围。
  • 该链接是文本范围“Foo”的子级,被 ITextProvider 围括。
  • 文本范围“Bar”没有子级,被 ITextProvider 围括。

补充说明:

具有同类型文本范围的文本单位边界处的退化(空)范围会显露为紧邻的文本单位的属性。

如果对具有同类型文本范围的文本单位边界处的退化(空)范围调用 IUIAutomationTextRange::ExpandToEnclosingUnit 时,会将该退化范围扩展到以下文本单位。

文本单位描述

本部分介绍 UI 自动化支持的每个文本单位。

字符

TextUnit_Character 是表示单个字符的文本语言单位。 字符的语言定义取决于具体语言。 在美国英语中,与一个字符相邻的通常是一个空格或另一个字符,如标点符号、数字或字母。

控制字符,如回车符和 Unicode 左到右标记 (LTM),不应视为字符,但可以包含在基于字符文本单位经过了规范化的文本范围中。

标点符号和断字符(如空格)应视为字符。

格式

TextUnit_Format 用于根据文本的格式属性确定文本范围的边界。 例如,如果文本范围当前确定为一个字词的一个字符,则在对 IUIAutomationTextRange::ExpandToEnclosingUnit 的调用中指定 TextUnit_Format 就会使该文本范围包含所有与该字符共享所有相同属性的所有文本。 所得到的文本范围可能包含或不包含整个字词。 此外,使用格式文本单位不会使文本范围扩展到超越嵌入对象边界(如图像或超链接)的程度。

与其他文本单位(包括小于自身的文本单位)不同,TextUnit_Format 可以小于或大于其他单位。 例如,如果整个文档共享相同的文本属性,并且不包含嵌入的对象,则通过 TextUnit_Format 扩展文本范围将生成一个包含整个文档的新范围,而通过 TextUnit_Word 扩展文本范围会生成一个更小的范围。

Word

TextUnit_Word 是一个代表单个完整字词的文本语言单位。 一个字词的语言定义取决于具体语言。 在美国英语中,与一个字词相邻的通常是空格或标点符号。

当使用 TextUnit_Word 设置文本范围的边界时,生成的文本范围应包含字词末尾处及下一个字词开头之前的任何断字符。

线条

TextUnit_Line 是一个表示控制视窗中显示的单行文本的文本单位。 使用 TextUnit_Line 设置文本范围的边界时,提供程序应将边界设置在紧接着控制字符将行中断的那点之后或控制视窗将文本换行到新行的那个位置。 应将边界设置在新行开始的位置。

Paragraph

TextUnit_Paragraph 是表示一个完整段落的文本语言单位。 一个段落应始于段落的第一个字符,且通常紧接着最后一个字符结束。 段落后面的任何空行都应合并到段落中,除非因文本源中某些内容而不适合这么操作。 通常,段落的结束边界还会标记 TextUnit_Line 文本单位的结束边界。

TextUnit_Page 表示文档的一个完整文本页。 页面的边界应设置在页面的开始和结束的位置。

文档

TextUnit_Document 表示文本控制模式支持的全部文档内容。 在包含文档的文本范围之外不应存在任何文本。 插入到文档中的任何对象(如跨页面边界的批注)都应视为文档的嵌入对象,而不是文档文本内容的一部分。

其他可能的范围

当前 TextRange 控制模式规范不允许将新的文本单位值添加到 TextUnit 枚举中,也不允许重新定义现有文本单位值。 若要公开其他可能的范围(如标头和批注),提供程序应将这些范围公开为具有关联文本范围的嵌入对象。 通过这种方式,就可同时添加对相应控制模式的支持。 此解决方案比定义新文本单位更灵活且更具扩展性。

参考

TextPatternRangeEndpoint

ITextRangeProvider::GetChildren

概念性

UI 自动化对文本内容的支持

使用基于文本的控件