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 所包含的任何額外內容或專案不會算作符號。
文字 Run 元素內的每一個16位Unicode字元。
文字容器 - 文字容器 是構成手邊流程內容最終框線的專案;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 |
取得範圍目前位置的邏輯父系。 |