Поделиться через


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 позиции, которая не является позицией вставки, — позиция между двумя смежными Paragraph тегами (то есть между закрывающим тегом предыдущего абзаца и открывающим тегом следующего абзаца).

  • Символ . В целях операций TextPointer , включающих символы, любой из следующих символов считается символом:

    • Открывающий или закрывающий тег элемента TextElement .

    • Элемент UIElement , содержащийся в объекте InlineUIContainer или BlockUIContainer. Обратите внимание, что такое UIElement всегда учитывается как один символ; любое дополнительное содержимое или элементы, содержащиеся в нем UIElement , не считаются символами.

    • Каждый 16-разрядный символ Юникода внутри текстового Run элемента.

  • Текстовый контейнер — текстовый контейнер — это элемент, который формирует конечную границу для содержимого потока. позиция, указанная TextPointer всегда находится в текстовом контейнере. В настоящее время текстовый контейнер должен быть либо a FlowDocumentTextBlock, либо . Как правило, операции между TextPointer экземплярами в разных текстовых контейнерах не поддерживаются.

  • Документ . Содержимое в текстовом контейнере называется документом, как в IsInSameDocument методе и DocumentStartDocumentEnd свойствах.

Класс TextPointer предназначен для упрощения обхода и манипуляции с содержимым, представленным элементами потока Windows Presentation Foundation (WPF), в целом такие элементы являются производными.TextElement Некоторые из операций, которые TextPointer упрощают, включают следующие:

  • Выполните порядковое сравнение текущей позиции со второй указанной позицией. См. CompareTo метод.

  • Определите тип содержимого, соседнего с текущей позицией в указанном направлении. См. GetPointerContext метод и TextPointerContext перечисление.

  • TextElement Получите области или рядом с текущей позицией. См Paragraph . и GetAdjacentElement метод.

  • Получите текстовый контейнер, охватывающий текущий документ. См. Parent свойство.

  • Получите указанное число символов выше или после текущей позиции. См. GetTextInRun метод.

  • Вставьте строку символов в текущей позиции. См. InsertTextInRun метод.

  • Найдите границы строк в содержимом. См. GetLineStartPosition метод и IsAtLineStartPosition свойство.

  • Перевод между TextPointer позициями и смещениями символов в содержимое. См. инструкции GetOffsetToPosition и GetPositionAtOffset методы.

  • Выполнение визуального TextPointer тестирования попадания путем преобразования между положением и Point представлением относительных координат.

  • Найдите рядом позицию вставки или проверьте, является ли текущая позиция позицией вставки. GetInsertionPosition См. методы и GetNextInsertionPositionIsAtInsertionPosition свойства.

Позиция и LogicalDirection указанная TextPointer объектом неизменяемая. Когда содержимое редактируется или изменяется, позиция, указанная не TextPointer изменяется относительно окружающего текста; вместо смещения этой позиции с начала содержимого корректируется соответствующим образом, чтобы отразить новую относительную позицию в содержимом. Например, позиция TextPointer в начале данного абзаца продолжает указывать на начало этого абзаца, даже если содержимое вставляется или удаляется до или после абзаца.

Класс TextPointer не предоставляет открытых конструкторов. Экземпляр TextPointer создается с помощью свойств или методов других объектов (включая другие TextPointer объекты). В следующем списке приведены несколько примеров методов и свойств, которые создают и возвращают объект TextPointer. Этот список не является исчерпывающим:

Свойства

Имя Описание
DocumentEnd

TextPointer Возвращает содержимое в текстовом контейнере, связанном с текущей позицией.

DocumentStart

TextPointer Возвращает в начале содержимого в текстовом контейнере, связанном с текущей позицией.

HasValidLayout

Возвращает значение, указывающее, имеет ли текстовый контейнер, связанный с текущей позицией, допустимый (up-to-date) макет.

IsAtInsertionPosition

Возвращает значение, указывающее, является ли текущая позиция позицией вставки.

IsAtLineStartPosition

Возвращает значение, указывающее, находится ли текущая позиция в начале строки.

LogicalDirection

Возвращает логическое направление, связанное с текущей позицией, которая используется для диамбигуации содержимого, связанного с текущей позицией.

Paragraph

Возвращает абзац, охватывающий текущую позицию, если таковой есть.

Parent

Возвращает логический родительский объект, который определяет текущую позицию.

Методы

Имя Описание
CompareTo(TextPointer)

Выполняет порядковое сравнение позиций, указанных текущим TextPointer и вторым заданным TextPointer.

DeleteTextInRun(Int32)

Удаляет указанное число символов из позиции, указанной текущим TextPointer.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetAdjacentElement(LogicalDirection)

Возвращает элемент, если таковой есть, границы текущего TextPointer в указанном логическом направлении.

GetCharacterRect(LogicalDirection)

Возвращает ограничивающий прямоугольник (Rect) для содержимого, ограничивающего текущее TextPointer в указанном логическом направлении.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetInsertionPosition(LogicalDirection)

TextPointer Возвращает до ближайшей позиции вставки в указанном логическом направлении.

GetLineStartPosition(Int32, Int32)

TextPointer Возвращает к началу строки, указанной относительно текущегоTextPointer, и сообщает, сколько строк пропущено.

GetLineStartPosition(Int32)

TextPointer Возвращает к началу строки, указанной относительно текущегоTextPointer.

GetNextContextPosition(LogicalDirection)

Возвращает указатель на следующий символ в указанном логическом направлении.

GetNextInsertionPosition(LogicalDirection)

Возвращает следующую TextPointer позицию вставки в указанном логическом направлении.

GetOffsetToPosition(TextPointer)

Возвращает количество символов между текущим TextPointer и вторым заданным TextPointer.

GetPointerContext(LogicalDirection)

Возвращает индикатор категории для содержимого, соседнего с текущим TextPointer в указанном логическом направлении.

GetPositionAtOffset(Int32, LogicalDirection)

TextPointer Возвращает позицию, указанную указанным смещением, в символах с начала текущего TextPointer и в указанном направлении.

GetPositionAtOffset(Int32)

TextPointer Возвращает положение, указанное смещением, в символах с начала текущегоTextPointer.

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

Копирует указанное максимальное количество символов из любого соседнего текста в указанном направлении в указанный массив символов, предоставленный вызывающим.

GetTextInRun(LogicalDirection)

Возвращает строку, содержащую любой текст, смежный с текущим TextPointer в указанном логическом направлении.

GetTextRunLength(LogicalDirection)

Возвращает число символов Юникода между текущим TextPointer и следующим нетекстовый символом в указанном логическом направлении.

GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
InsertLineBreak()

Вставляет разрыв строки в текущей позиции.

InsertParagraphBreak()

Вставляет разрыв абзаца в текущей позиции.

InsertTextInRun(String)

Вставляет указанный текст в текст Run в текущей позиции.

IsInSameDocument(TextPointer)

Указывает, находится ли указанная позиция в том же текстовом контейнере, что и текущая позиция.

MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
ToString()

Этот тип или член поддерживает инфраструктуру Windows Presentation Foundation (WPF) и не предназначен для использования непосредственно из кода.

Применяется к

См. также раздел