Как я перемещаю каре определенное число положений в WPF RichTextBox?

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

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

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


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

8
задан Rob 23 March 2010 в 12:35
поделиться

3 ответа

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

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

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

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

8
ответ дан 5 December 2019 в 17:35
поделиться

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

private void rtb_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Tab)
    {
        rtb.CaretPosition.GetInsertionPosition(LogicalDirection.Backward).InsertTextInRun("    ");
        e.Handled = true;
    }
}
1
ответ дан 5 December 2019 в 17:35
поделиться

Для проверки вы можете попробовать принудительно перемещать себя:

rtb.CaretPosition = rtb.Document.ContentEnd;

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

1
ответ дан 5 December 2019 в 17:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: