Как переместить каретку на определенное количество позиций в WPF RichTextBox? - PullRequest
8 голосов
/ 23 марта 2010

Я хочу переместить каретку на 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 имеет неприятный побочный эффект, заключающийся в отступе текста в последующих строках, что не , что я хочу.

Ответы [ 3 ]

8 голосов
/ 27 мая 2010

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

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

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

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

1 голос
/ 17 августа 2010

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

rtb.CaretPosition = rtb.Document.ContentEnd;

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

1 голос
/ 23 марта 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;
    }
}
...