Многострочное текстовое поле WPF прокрутки до позиции курсора

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

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

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

 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.


person schorsch1989    schedule 05.08.2020    source источник
comment
Я почти уверен, что то, что вы хотите, уже является поведением по умолчанию. По умолчанию TextBox будет прокручиваться до конца строки, если ранее была нажата клавиша End. Также по умолчанию TextBox перемещает курсор на следующую / предыдущую строку при нажатии клавиши вниз / вверх. По умолчанию положение курсора прокручивается в поле зрения. Ваша ручная прокрутка строк нарушает это поведение. Я также сомневаюсь, что ваш код действительно делает то, что вы думаете. Перед выполнением вашего кода TextBox уже обработал ключевые события.   -  person BionicCode    schedule 06.08.2020
comment
Если вы отметите событие как обработанное, вы можете понять, что ваш код на самом деле ничего не делает. Очевидно, что TextBox в конечном итоге строится вокруг ключевых событий - это элемент управления вводом текста. Происходит много операций по нажатию клавиш, и большая часть обработки событий фактически откладывается, что приводит к перезаписи действий обработчика клиента. Интересно, почему вы думаете, что вам нужно заново реализовать обработку клавиатуры для TextBox.   -  person BionicCode    schedule 06.08.2020
comment
да, я тоже подумал, что это стандартная обработка текстового поля. Но, похоже, это не так просто. Кажется, что все эти приятные поведения работают только в том случае, если текстовое поле имеет фиксированный размер. Прочтите в некоторых статьях, что средство просмотра прокрутки не может динамически обрабатывать размер элемента. Поскольку я знаю, что в текстовом поле используется один (не от меня, а по определению), я подумал, что это должно быть проблемой. Без моей обработки стрелок вниз и вверх текстовое поле не будет прокручиваться до правой строки.   -  person schorsch1989    schedule 06.08.2020
comment
я нашел проблему. Не думал, что шаблон стиля может повлиять на такое странное поведение - даже если он основан на этих элементах и ​​стиль по умолчанию не перезаписывается. Поскольку у меня было закругленное текстовое поле, мне также пришлось изменить полосы прокрутки. Хотите сделать это с помощью шаблона стиля для средства просмотра прокрутки. Все закончилось странным поведением. Теперь я использую только шаблон для полос прокрутки, и он будет работать нормально ... Поэтому решено - по-другому, я думал, но он сработал ... пометил бы его как решенный, но не нашел, как.   -  person schorsch1989    schedule 06.08.2020


Ответы (1)


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

пройти

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

в ScrollContentPresenter.

После этого стандартное поведение будет работать нормально!

person schorsch1989    schedule 06.08.2020