сегодня я ищу способ прокрутки многострочного текстового поля с динамическим размером.
Я хочу прокрутить до курсора и не нахожу в Интернете никакой полезной информации.
Попробовав много вещей, я знаю, как прокручивать до конца строки, но не как прокручивать до каретки. Прокрутка к правой строке уже реализована, но горизонтальная часть прокрутки уже отсутствует.
private void txtText_PreviewKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Down || e.Key == Key.Up)
{
var CurrentLineIndex = txtText.GetLineIndexFromCharacterIndex(((TextBox)sender).SelectionStart);
txtText.ScrollToLine(CurrentLineIndex);
}
}
Это мой текущий код, который для меня выполняет прокрутку до нужной строки.
Пытался сделать что-то похожее на горизонтальную прокрутку:
var rect = ((TextBox)sender).GetRectFromCharacterIndex(((TextBox)sender).CaretIndex);
txtText.ScrollToHorizontalOffset(Math.Max((txtText.HorizontalOffset + rect.Right - (txtText.ActualWidth - 40)), 0.0));
Но это работает не так, как ожидалось, он прокручивается не до горизонтального положения курсора.
Думаю, надо было лучше описать:
если я перемещаю курсор с помощью стрелки влево или вправо, он будет работать нормально, ничего не реализуя.
Это не сработает, если я сделаю это:
Переходите от одной строки к другой. Иногда одна из этих строк длиннее или короче другой, и в этом случае мне приходилось прокручивать до позиции курсора.
Пример:
Строка1 длиннее, чем строка2
Я перемещаюсь концом клавиши на клавиатуре до конца строки 1.
Затем я перехожу к строке 2.
Все работает правильно, курсор переходит в конец строки 2, и он автоматически прокручивается в видимую область.
Но если я вернусь с строки2 на строку1, каретка будет находиться прямо в конце строки1. Но прокручивается не до конца строки1.
TextBox
будет прокручиваться до конца строки, если ранее была нажата клавиша End. Также по умолчаниюTextBox
перемещает курсор на следующую / предыдущую строку при нажатии клавиши вниз / вверх. По умолчанию положение курсора прокручивается в поле зрения. Ваша ручная прокрутка строк нарушает это поведение. Я также сомневаюсь, что ваш код действительно делает то, что вы думаете. Перед выполнением вашего кодаTextBox
уже обработал ключевые события. - person BionicCode   schedule 06.08.2020TextBox
в конечном итоге строится вокруг ключевых событий - это элемент управления вводом текста. Происходит много операций по нажатию клавиш, и большая часть обработки событий фактически откладывается, что приводит к перезаписи действий обработчика клиента. Интересно, почему вы думаете, что вам нужно заново реализовать обработку клавиатуры дляTextBox
. - person BionicCode   schedule 06.08.2020