TextPointer 类
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
表示 FlowDocument 或 TextBlock中的位置。
public ref class TextPointer : System::Windows::Documents::ContentPosition
public class TextPointer : System.Windows.Documents.ContentPosition
type TextPointer = class
inherit ContentPosition
Public Class TextPointer
Inherits ContentPosition
- 继承
示例
以下示例演示如何使用 TextPointer 查找位于指定文本容器中第一个 Run 元素内的位置。
// This method returns the position just inside of the first text Run (if any) in a
// specified text container.
TextPointer FindFirstRunInTextContainer(DependencyObject container)
{
TextPointer position = null;
if (container != null){
if (container is FlowDocument)
position = ((FlowDocument)container).ContentStart;
else if (container is TextBlock)
position = ((TextBlock)container).ContentStart;
else
return position;
}
// Traverse content in forward direction until the position is immediately after the opening
// tag of a Run element, or the end of content is encountered.
while (position != null)
{
// Is the current position just after an opening element tag?
if (position.GetPointerContext(LogicalDirection.Backward) == TextPointerContext.ElementStart)
{
// If so, is the tag a Run?
if (position.Parent is Run)
break;
}
// Not what we're looking for; on to the next position.
position = position.GetNextContextPosition(LogicalDirection.Forward);
}
// This will be either null if no Run is found, or a position just inside of the first Run element in the
// specifed text container. Because position is formed from ContentStart, it will have a logical direction
// of Backward.
return position;
}
' This method returns the position just inside of the first text Run (if any) in a
' specified text container.
Private Function FindFirstRunInTextContainer(ByVal container As DependencyObject) As TextPointer
Dim position As TextPointer = Nothing
If container IsNot Nothing Then
If TypeOf container Is FlowDocument Then
position = (CType(container, FlowDocument)).ContentStart
ElseIf TypeOf container Is TextBlock Then
position = (CType(container, TextBlock)).ContentStart
Else
Return position
End If
End If
' Traverse content in forward direction until the position is immediately after the opening
' tag of a Run element, or the end of content is encountered.
Do While position IsNot Nothing
' Is the current position just after an opening element tag?
If position.GetPointerContext(LogicalDirection.Backward) = TextPointerContext.ElementStart Then
' If so, is the tag a Run?
If TypeOf position.Parent Is Run Then
Exit Do
End If
End If
' Not what we're looking for on to the next position.
position = position.GetNextContextPosition(LogicalDirection.Forward)
Loop
' This will be either null if no Run is found, or a position just inside of the first Run element in the
' specifed text container. Because position is formed from ContentStart, it will have a logical direction
' of Backward.
Return position
End Function
以下示例使用 TextPointer 设施实现简单查找算法。
// This method will search for a specified word (string) starting at a specified position.
TextPointer FindWordFromPosition(TextPointer position, string word)
{
while (position != null)
{
if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
{
string textRun = position.GetTextInRun(LogicalDirection.Forward);
// Find the starting index of any substring that matches "word".
int indexInRun = textRun.IndexOf(word);
if (indexInRun >= 0)
{
position = position.GetPositionAtOffset(indexInRun);
break;
}
}
else
{
position = position.GetNextContextPosition(LogicalDirection.Forward);
}
}
// position will be null if "word" is not found.
return position;
}
' This method will search for a specified word (string) starting at a specified position.
Private Function FindWordFromPosition(ByVal position As TextPointer, ByVal word As String) As TextPointer
Do While position IsNot Nothing
If position.GetPointerContext(LogicalDirection.Forward) = TextPointerContext.Text Then
Dim textRun As String = position.GetTextInRun(LogicalDirection.Forward)
' Find the starting index of any substring that matches "word".
Dim indexInRun As Integer = textRun.IndexOf(word)
If indexInRun >= 0 Then
position = position.GetPositionAtOffset(indexInRun)
Exit Do
End If
Else
position = position.GetNextContextPosition(LogicalDirection.Forward)
End If
Loop
' position will be null if "word" is not found.
Return position
End Function
注解
TextPointer 类引入了以下术语:
位置 - 本质上,TextPointer 始终指向内容中 位置。 此类位置要么位于内容中的字符之间,要么位于定义内容结构的流内容元素标记之间。
当前位置 - 由于 TextPointer 始终指示一个位置,并且由于可通过 TextPointer 执行的许多操作都相对于 TextPointer当前指向的位置,因此只需将 TextPointer 指示的位置称为 当前位置是有意义的。
插入位置 - 插入位置 是一个位置,可以在不中断关联内容的任何语义规则的情况下添加新内容。 实际上,插入位置位于可放置插入点的内容中的任何位置。 不是插入位置的有效 TextPointer 位置的一个示例是两个相邻的 Paragraph 标记之间的位置(即,在上一段的结束标记和下一段的开始标记之间)。
符号 - 出于涉及符号的 TextPointer 操作的目的,以下任何一项被视为 符号:
TextElement 元素的开始或结束标记。
包含在 InlineUIContainer 或 BlockUIContainer中的 UIElement 元素。 请注意,此类 UIElement 始终计为一个符号;UIElement 包含的任何其他内容或元素不计为符号。
文本中的每个 16 位 Unicode 字符 Run 元素。
文本容器 - 文本容器 是构成手头流内容的最终边框的元素;TextPointer 指示的位置始终位于文本容器中。 目前,文本容器必须是 FlowDocument 或 TextBlock。 一般来说,不支持不同文本容器中 TextPointer 实例之间的操作。
文档 - 文本容器中的内容称为 文档,如 IsInSameDocument 方法和 DocumentStart 和 DocumentEnd 属性。
TextPointer 类旨在促进 Windows Presentation Foundation (WPF) 流内容元素表示的内容的遍历和操作;通常,此类元素派生自 TextElement。 TextPointer 促进的一些操作包括:
执行与第二个指定位置的当前位置的序号比较。 请参阅 CompareTo 方法。
确定在指定方向上与当前位置相邻的内容的类型。 请参阅 GetPointerContext 方法和 TextPointerContext 枚举。
获取范围或与当前位置相邻的 TextElement。 请参阅 Paragraph 和 GetAdjacentElement 方法。
获取限定当前文档范围的文本容器。 请参阅 Parent 属性。
获取前面或关注当前位置的指定字符数。 请参阅 GetTextInRun 方法。
在当前位置插入字符字符串。 请参阅 InsertTextInRun 方法。
在内容中查找线条边界。 请参阅 GetLineStartPosition 方法和 IsAtLineStartPosition 属性。
在 TextPointer 位置和符号偏移量之间转换到内容中。 请参阅 GetOffsetToPosition 和 GetPositionAtOffset 方法。
通过在 TextPointer 位置和表示相对坐标的 Point 之间进行转换来执行视觉命中测试。
查找附近的插入位置,或检查当前位置是否为插入位置。 请参阅 GetInsertionPosition 和 GetNextInsertionPosition 方法和 IsAtInsertionPosition 属性。
由 TextPointer 对象指示的位置和 LogicalDirection 是不可变的。 编辑或修改内容时,TextPointer 指示的位置不会相对于周围的文本而更改;相反,相应调整该位置与内容开头的偏移量,以反映内容中的新相对位置。 例如,指示给定段落开头的位置的 TextPointer 仍指向该段落的开头,即使内容在段落之前或之后插入或删除。
TextPointer 类不提供任何公共构造函数。 使用其他对象的属性或方法(包括其他 TextPointer 对象)创建 TextPointer 实例。 以下列表提供了创建和返回 TextPointer的方法和属性的几个示例。 此列表并不详尽:
从 TextElement:ContentStart、ContentEnd、ElementStart和 ElementEnd。
从 TextBlock(文本容器):ContentStart、ContentEnd和 GetPositionFromPoint。
从 FlowDocument(文本容器):ContentStart和 ContentEnd
从现有 TextPointer:DocumentStart、DocumentEnd、GetNextInsertionPosition和 GetPositionAtOffset。
属性
DocumentEnd |
获取与当前位置关联的文本容器中内容末尾的 TextPointer。 |
DocumentStart |
获取与当前位置关联的文本容器中内容开头的 TextPointer。 |
HasValidLayout |
获取一个值,该值指示与当前位置关联的文本容器是否具有有效的 (up-to-date) 布局。 |
IsAtInsertionPosition |
获取一个值,该值指示当前位置是否为插入位置。 |
IsAtLineStartPosition |
获取一个值,该值指示当前位置是否位于行的开头。 |
LogicalDirection |
获取与当前位置关联的逻辑方向,该方向用于消除与当前位置关联的内容。 |
Paragraph |
获取限定当前位置(如果有)的段落。 |
Parent |
获取限定当前位置的逻辑父级。 |