次の方法で共有


TextPointer クラス

定義

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

次の例では、 を使用 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 位置の例は、2 つの隣接する Paragraph タグ間 (つまり、前の段落の終了タグと次の段落の開始タグの間) の位置です。

  • シンボル - シンボルを含む操作の TextPointer 目的で、次のいずれかが シンボルと見なされます。

    • 要素の開始タグまたは終了タグ TextElement

    • UIElementまたは BlockUIContainerInlineUIContainer含まれる要素。 このような は UIElement 常に 1 つのシンボルとしてカウントされます。に含まれる UIElement 追加のコンテンツまたは要素はシンボルとしてカウントされません。

    • テキスト Run 要素内の各 16 ビット Unicode 文字。

  • テキスト コンテナー - テキスト コンテナー は、手元のフロー コンテンツの最終的な境界線を形成する要素です。によって示される位置は TextPointer 、常にテキスト コンテナー内に含まれます。 現在、テキスト コンテナーは または であるFlowDocumentTextBlock必要があります。 一般に、異なるテキスト コンテナー内のインスタンス間 TextPointer の操作はサポートされていません。

  • Document - テキスト コンテナー内のコンテンツは、 メソッドと プロパティおよび DocumentEnd プロパティのようにIsInSameDocument、ドキュメントDocumentStart呼ばれます。

クラスはTextPointer、Windows Presentation Foundation (WPF) フロー コンテンツ要素によって表されるコンテンツのトラバーサルと操作を容易にすることを目的としています。一般に、このような要素は からTextElement派生します。 次のような操作 TextPointer が容易になります。

  • 現在の位置と 2 番目の指定した位置の序数比較を実行します。 メソッドを CompareTo 参照してください。

  • 指定した方向の現在位置に隣接するコンテンツの種類を決定します。 メソッドとTextPointerContext列挙体をGetPointerContext参照してください。

  • 現在の位置に TextElement 隣接する または をスコープとする を取得します。 および メソッドをGetAdjacentElement参照してくださいParagraph

  • 現在のドキュメントをスコープとするテキスト コンテナーを取得します。 Parent プロパティをご覧ください。

  • 現在の位置の前または後に指定した文字数を取得します。 メソッドを GetTextInRun 参照してください。

  • 現在の位置に文字の文字列を挿入します。 メソッドを InsertTextInRun 参照してください。

  • コンテンツ内の線の境界を検索します。 メソッドとIsAtLineStartPositionプロパティをGetLineStartPosition参照してください。

  • 位置とシンボル オフセットの間 TextPointer をコンテンツに変換します。 メソッドと GetPositionAtOffset メソッドをGetOffsetToPosition参照してください。

  • 位置とPoint相対座標を表す の間でTextPointer変換することで、視覚的なヒット テストを実行します。

  • 近くの挿入位置を検索するか、現在の位置が挿入位置であるかどうかを確認します。 GetInsertionPositionおよび GetNextInsertionPosition メソッドと プロパティをIsAtInsertionPosition参照してください。

オブジェクトによってTextPointer示される 位置LogicalDirectionは変更できません。 コンテンツが編集または変更されると、 によって TextPointer 示される位置は周囲のテキストに対して相対的に変化しません。コンテンツの先頭からの位置のオフセットは、コンテンツ内の新しい相対位置を反映するように対応して調整されます。 たとえば、特定の段落の先頭の位置を示す は、 TextPointer 段落の前後にコンテンツが挿入または削除された場合でも、その段落の先頭を指し続けます。

クラスは TextPointer パブリック コンストラクターを提供しません。 のインスタンスは、他のオブジェクト (他TextPointerTextPointerオブジェクトを含む) のプロパティまたはメソッドを使用して作成されます。 次の一覧では、 を作成して返すメソッドとプロパティの例をいくつか TextPointer示します。 この一覧は完全ではありません。

プロパティ

DocumentEnd

現在の位置に関連付けられているテキスト コンテナーのコンテンツの末尾にある TextPointer を取得します。

DocumentStart

現在の位置に関連付けられているテキスト コンテナーのコンテンツの先頭にある TextPointer を取得します。

HasValidLayout

現在の位置に関連付けられているテキスト コンテナーに有効な (最新の) レイアウトがあるかどうかを示す値を取得します。

IsAtInsertionPosition

現在の位置が挿入位置かどうかを示す値を取得します。

IsAtLineStartPosition

現在の位置が行頭にあるかどうかを示す値を取得します。

LogicalDirection

現在の位置に関連付けられている論理方向を取得します。論理方向は、現在の位置に関連付けられているコンテンツのあいまいさを解消するために使用されます。

Paragraph

現在の位置のスコープとなる段落を取得します (存在する場合)。

Parent

現在の位置のスコープとなる論理上の親を取得します (存在する場合)。

メソッド

CompareTo(TextPointer)

現在の TextPointer と指定された 2 つ目の TextPointer によって指定される位置の順序を比較します。

DeleteTextInRun(Int32)

現在の TextPointer で示される位置から指定された文字数を削除します。

Equals(Object)

指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。

(継承元 Object)
GetAdjacentElement(LogicalDirection)

指定された論理方向で現在の TextPointer に隣接する要素を返します (存在する場合)。

GetCharacterRect(LogicalDirection)

指定した論理方向で現在の Rect に隣接するコンテンツの境界ボックス (TextPointer) を返します。

GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetInsertionPosition(LogicalDirection)

指定した論理方向の最も近い挿入位置への TextPointer を返します。

GetLineStartPosition(Int32)

現在の TextPointer の位置に対する相対位置で指定した行の先頭にある TextPointer を返します。

GetLineStartPosition(Int32, Int32)

現在の TextPointer の位置に対する相対位置で指定した行の先頭にある TextPointer を返し、スキップされた行数を通知します。

GetNextContextPosition(LogicalDirection)

指定された論理方向の次のシンボルへのポインターを返します。

GetNextInsertionPosition(LogicalDirection)

指定された論理方向の次の挿入位置への TextPointer を返します。

GetOffsetToPosition(TextPointer)

現在の TextPointer と指定した 2 つ目の TextPointer の間にあるシンボルの数を返します。

GetPointerContext(LogicalDirection)

指定された論理方向で現在の TextPointer に隣接するコンテンツのカテゴリ インジケーターを返します。

GetPositionAtOffset(Int32)

現在の TextPointer の先頭からの指定されたオフセット (シンボル単位) が示す位置への TextPointer を返します。

GetPositionAtOffset(Int32, LogicalDirection)

指定された方向に、現在の TextPointer の先頭からの指定されたオフセット (シンボル単位) が示す位置への TextPointer を返します。

GetTextInRun(LogicalDirection)

指定された論理方向で現在の TextPointer に隣接するテキストを格納する文字列を返します。

GetTextInRun(LogicalDirection, Char[], Int32, Int32)

指定された方向の隣接するテキストから、指定された最大数の文字を、呼び出し元が用意した文字配列にコピーします。

GetTextRunLength(LogicalDirection)

現在の TextPointer と、指定された論理方向の次のテキスト以外のシンボルとの間にある Unicode 文字の数を返します。

GetType()

現在のインスタンスの Type を取得します。

(継承元 Object)
InsertLineBreak()

現在の位置に改行を挿入します。

InsertParagraphBreak()

現在の位置に段落の区切りを挿入します。

InsertTextInRun(String)

現在の位置のテキスト Run に、指定されたテキストを挿入します。

IsInSameDocument(TextPointer)

指定された位置が現在の位置と同じテキスト コンテナーに含まれているかどうかを示します。

MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

この型またはメンバーは、Windows Presentation Foundation (WPF) インフラストラクチャをサポートしますが、独自に作成したコードから直接使用するためのものではありません。

適用対象

こちらもご覧ください