#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. Спасибо, это многое объясняет! Я попробую использовать смещение для нового содержимого, чтобы переместить позицию курсора