WPF прокрутка многострочного текстового поля до позиции курсора - PullRequest
0 голосов
/ 05 августа 2020

сегодня я ищу способ прокрутки многострочного текстового поля с динамическим размером.

Я хочу прокрутить до курсора и не нахожу никакой полезной информации в inte rnet.

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

 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

Я перехожу с помощью клавиши «end» на клавиатуре до конца строки1.

Затем я перехожу к строке2.

Все работает правильно, каретка переходит в конец строки 2 и автоматически прокручивается в видимую область.

Но если я go вернулся с строки 2 на строку 1, каретка будет находиться прямо в конце строки 1. Но прокручивается не до конца строки 1.

1 Ответ

0 голосов
/ 06 августа 2020

проблема заключалась в том, что я использовал шаблон стиля и забыл необходимое:

передать

 ContentTemplate="{TemplateBinding ContentTemplate}" CanContentScroll="{TemplateBinding CanContentScroll}" 

в ScrollContentPresenter.

После этого стандартное поведение подойдет!

...