TextBox ScrollToHorizontOffset не будет прокручиваться после того, как текст достаточно длинный - PullRequest
1 голос
/ 18 декабря 2010

У меня есть текстовое поле (например, textBox1), к которому я периодически добавляю символ (каждую секунду или около того). Я хотел бы сделать так, чтобы, когда текст становится слишком длинным, чтобы поместиться в текстовое поле, переполнение будет фактически идти влево от текстового поля, даже если оно не сфокусировано вместо нормального поведения, которое находится справа, таким образом последний символ всегда будет показано. То, как я это сделал, когда я добавляю персонажа, я также делаю:

textBox1.ScrollToHorizontalOffset(textBox1.GetRectFromCharacterIndex(textBox1.Text.Length).Right);

Это работает хорошо, пока длина текста не станет достаточно длинной. После этого прокрутка точки просто прекратится, и текущее левое переполнение останется, но новое переполнение перейдет справа от текстового поля. Для тестирования я пишу текущую длину текста и textBox1.GetRectFromCharacterIndex (textBox1.Text.Length). Право на консоль при каждом обновлении:

...
Length: 22
Rect.Right: 81.99
Length: 23
Rect.Right: 85.4
Length: 24
Rect.Right: 88.81
Length: 25
Rect.Right: 91.41
Length: 26
Rect.Right: 91.41
Length: 27
Rect.Right: 91.4099999999999
Length: 28
Rect.Right: 91.4099999999999
Length: 29
Rect.Right: 91.4099999999999
Length: 30
Rect.Right: 91.4099999999999
...
Length: 47
Rect.Right: 91.4099999999999
Length: 48
Rect.Right: 91.4099999999999
Length: 49
Rect.Right: 91.4099999999999
Length: 50
Rect.Right: 91.4099999999999
Length: 51
Rect.Right: 91.4099999999999
Length: 52
Rect.Right: 92.88
Length: 53
Rect.Right: 94.8199999999999
Length: 54
Rect.Right: 96.29
Length: 55
Rect.Right: 98.2299999999999
Length: 56
Rect.Right: 99.7
Length: 57
Rect.Right: 101.64

До того как Text.Length равно 25, текстовое поле все еще достаточно широкое, чтобы вместить все. После этой точки текст больше не помещается, и прокрутка работает до тех пор, пока длина не станет 52.

Ответы [ 2 ]

3 голосов
/ 18 декабря 2010

Это странное поведение - я воспроизвел то же самое.

Я получил эффект, который вы ищете, вместо использования

textbox1.ScrollToHorizontalOffset(double.MaxValue);

Поскольку вы хотите полностью прокрутить вправо, передача значения, превышающего фактическое местоположение персонажа, не повредит.

0 голосов
/ 11 мая 2015

Все вышеперечисленное не работает для меня надежно.Делая что-то еще, я наткнулся на этот подход (используя выделение выделения).TB - это текстовое поле, ofs - индекс символа для требуемого смещения.

TB.Focus();   //must be used
TB.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Right;
TB.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Left;
TB.Select(0, ofs);   //select up through desired offset
TB.Select(0, 0);     //turn off selection

... надеюсь, это поможет!

...