Как переместить курсор на определенное количество позиций в WPF RichTextBox?

Я хочу переместить каретку на 4 позиции вправо от того места, где сейчас находится моя каретка. Я зарегистрирован для PreviewKeyDown и звоню InsertTextInRun(), когда захвачена клавиша табуляции, например:

private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        rtb.CaretPosition.InsertTextInRun("    ");
        e.Handled = true;
    }
}

Проблема в том, что курсор остается на месте после вызова InsertTextInRun(). Он не перемещается в конец нового текста, что мне и нужно. Как бы я это сделал?


Кстати, да, я знаю о свойстве AcceptsTab на RichTextBox. Я решил проигнорировать это и свернуть свою собственную функциональность табуляции, потому что табуляция с AcceptsTab имеет неприятный побочный эффект отступа текста в последующих строках, а это не то, что мне нужно.


person Rob    schedule 23.03.2010    source источник


Ответы (3)


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

Следующий код гарантирует (3.5sp1), что после вставки курсор будет справа от вставленного текста:

 rtb.CaretPosition = rtb.CaretPosition.GetPositionAtOffset(0, LogicalDirection.Forward);
rtb.CaretPosition.InsertTextInRun(text);

Обратите внимание, что свойство LogicalDirection каретки может (и должно) быть изменено этим; недостаточно просто создать правильный TextPointer.

person DK.    schedule 26.05.2010

Используйте метод GetInsertionPosition(). на текстовом указателе CaretPosition. Это позволит вам вставить текст перед кареткой.

private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        rtb.CaretPosition.GetInsertionPosition(LogicalDirection.Backward).InsertTextInRun("    ");
        e.Handled = true;
    }
}
person Tarsier    schedule 23.03.2010
comment
Вау, я, должно быть, пропустил это! В ближайшее время попробую, спасибо! :) - person Rob; 23.03.2010
comment
Извините, нет игральных костей. Каретка не переместилась в конец вставленного текста. - person Rob; 24.03.2010
comment
У меня тоже не сработало, единственное решение, которое работает, - это принятое решение. - person ToastyMallows; 27.06.2013

Чтобы проверить, вы можете попробовать заставить движение самостоятельно:

rtb.CaretPosition = rtb.Document.ContentEnd;

Если это сработает, вам, вероятно, придется реализовать дополнительную логику для ситуаций, когда вкладка не находится в конце содержимого.

person Pakman    schedule 17.08.2010