Как я могу программно переместить caretposition в RichTextBox?

#wpf #wpf-controls #richtextbox

#wpf #wpf-элементы управления #richtextbox

Вопрос:

У меня есть RichTextBox с пользовательским форматированием специальных фрагментов текста в нем. Однако есть ошибка, из-за которой после вставки символа курсор помещается перед вновь вставленным символом, а не после.

Это потому, что для каждого редактирования код пересчитывает содержимое, чтобы применить пользовательское форматирование, а затем устанавливает CaretPosition следующим образом…

  protected override void OnTextChanged(TextChangedEventArgs e)
    {
        base.OnTextChanged(e);

        currentPos = CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward);

        // Apply special formatting on the content
        Content = GetContentValue();

        if (currentPos != null)
            CaretPosition = currentPos;

    }
  

Я не уверен, как переместить курсор в коде, чтобы он отображался ПОСЛЕ вставленного символа, например, если исходное содержимое равно «11», и я вставляю «2» в середине текста, я бы хотел, чтобы курсор был после «2».

В настоящее время он отображается как «1×21» (где x — курсор). Буду признателен за любую помощь

Ответ №1:

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

Приведенный ниже код вставляет текст Button.Click .

 private void Button_Click(object sender, RoutedEventArgs e)
    {
        /* text to insert */            
        string text = "some text";

        /* get start pointer */
        TextPointer startPtr = Rtb.Document.ContentStart;

        /* get current caret position */ 
        int start = startPtr.GetOffsetToPosition(Rtb.CaretPosition);

        /* insert text */
        Rtb.CaretPosition.InsertTextInRun(text);

        /* update caret position */
        Rtb.CaretPosition = startPtr.GetPositionAtOffset((start)   text.Length);

        /* update focus */
        Rtb.Focus();
    }
  

Комментарии:

1. Спасибо, это многое объясняет! Я попробую использовать смещение для нового содержимого, чтобы переместить позицию курсора