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
- 继承
示例
下面的示例演示如何使用 a 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 开始或结束标记。
UIElement包含在或 InlineUIContainer . BlockUIContainer中的元素。 请注意,此类 UIElement 始终只算为一个符号;任何其他内容或元素不包含 UIElement 在符号中。
文本 Run 元素中的每个 16 位 Unicode 字符。
文本 容器 - 文本容器 是构成当前流内容的最终边框的元素;由始终位于文本容器中的位置 TextPointer 。 目前,文本容器必须是 FlowDocument 一个或一个 TextBlock。 一般来说,不支持不同文本容器中的实例之间的 TextPointer 操作。
文档 - 文本容器中的内容称为 文档,如方法和DocumentStartDocumentEnd属性中IsInSameDocument所示。
此类TextPointer旨在方便遍历和操作由 Windows Presentation Foundation (WPF) 流内容元素表示的内容的遍历和操作;通常,此类元素派生自 TextElement。 有助于执行以下操作的一些操作 TextPointer 包括:
使用第二个指定位置对当前位置执行序号比较。 请参阅该方法 CompareTo 。
确定在指定方向上与当前位置相邻的内容的类型。 GetPointerContext请参阅方法和TextPointerContext枚举。
获取 TextElement 该作用域或与当前位置相邻。 请参阅 Paragraph 和 GetAdjacentElement 方法。
获取限定当前文档范围的文本容器。 请参阅 Parent 属性。
获取前面或遵循当前位置的指定字符数。 请参阅该方法 GetTextInRun 。
在当前位置插入一个字符串字符。 请参阅该方法 InsertTextInRun 。
在内容中查找线条边界。 GetLineStartPosition请参阅方法和IsAtLineStartPosition属性。
将位置和符号偏移量转换为 TextPointer 内容。 请参阅和GetOffsetToPositionGetPositionAtOffset方法。
通过在位置与Point表示相对坐标之间进行TextPointer转换来执行视觉命中测试。
查找附近的插入位置,或检查当前位置是否为插入位置。 GetInsertionPosition请参阅和GetNextInsertionPosition方法以及IsAtInsertionPosition属性。
对象所指示TextPointer的位置LogicalDirection是不可变的。 编辑或修改内容时,由 TextPointer 周围文本指示的位置不会更改;相反,相应调整内容开头位置的偏移量以反映内容中的新相对位置。 例如, TextPointer 指示给定段落开头的位置继续指向该段落的开头,即使内容在段落之前或之后插入或删除。
该 TextPointer 类不提供任何公共构造函数。 通过使用其他对象的属性或方法创建实例 TextPointer , (包括其他 TextPointer 对象) 。 以下列表提供了创建和返回 a TextPointer的方法和属性的几个示例。 此列表并不详尽:
TextElement从 :ContentStart、ContentEnd、ElementStart和ElementEnd.
TextBlock 从 (文本容器) :ContentStart,ContentEnd和GetPositionFromPoint。
FlowDocument 从 (文本容器) : ContentStartContentEnd
从现有 TextPointer项: DocumentStart、 DocumentEnd、 GetNextInsertionPosition和 GetPositionAtOffset。
属性
DocumentEnd |
获取一个 TextPointer,它指向文本容器中与当前位置相关联的内容的结束位置。 |
DocumentStart |
获取一个 TextPointer,它指向文本容器中与当前位置相关联的内容的开始位置。 |
HasValidLayout |
获取一个值,该值指示与当前位置相关联的文本容器是否具有有效(最新)的布局。 |
IsAtInsertionPosition |
获取一个值,该值指示当前位置是否是一个插入位置。 |
IsAtLineStartPosition |
获取一个值,该值指示当前位置是否位于行的开始处。 |
LogicalDirection |
获取与当前位置相关联的逻辑方向,用于消除与当前位置相关联内容的不确定性。 |
Paragraph |
获取涵盖当前位置的段落(如果有)。 |
Parent |
获取涵盖当前位置的逻辑父项。 |