Я хочу переместить положения каре 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
имеет противный побочный эффект делающего отступ текста на последующих строках, который не является тем, что я хочу.
Я только что столкнулся с той же проблемой. Кажется, конечное положение каретки зависит от того, в какую сторону она двигалась прямо перед вставкой.
Следующий код гарантирует (3.5sp1), что после вставки курсор будет справа от вставленного текста:
rtb.CaretPosition = rtb.CaretPosition.GetPositionAtOffset(0, LogicalDirection.Forward);
rtb.CaretPosition.InsertTextInRun(text);
Обратите внимание, что свойство LogicalDirection карета может (и должно) быть изменено этим; недостаточно просто создать правильный TextPointer.
Используйте метод 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;
}
}
Для проверки вы можете попробовать принудительно перемещать себя:
rtb.CaretPosition = rtb.Document.ContentEnd;
Если это сработает, вам, вероятно, придется реализовать дополнительную логику для ситуаций, когда вкладка находится не в конце содержимого .