2010-10-29 18 views
5

Esto parece una cosa tan simple, pero no puedo hacer que funcione.Desplazamiento al final de una sola línea WPF TextBox

Tengo un cuadro de texto de una sola línea que tiene mucho texto. Lo que quiero que suceda es que cada vez que el cuadro de texto recibe el foco, se desplaza hasta el final del texto para que se vea y el cursor esté al final listo para aceptar texto nuevo.

En el evento GotFocus del cuadro de texto llamo textBox.ScrollToEnd(). Parece que todo lo que hace es mover el cursor al final del cuadro de texto pero no poner el final en la vista.

¿Qué me estoy perdiendo?

Respuesta

12

Usted debe ser capaz de hacer que el uso de estos miembros:


EDIT: No estoy seguro por qué ScrollToEnd no está funcionando ... En fin, este código funciona:

textBox.CaretIndex = textBox.Text.Length; 
var rect = textBox.GetRectFromCharacterIndex(textBox.CaretIndex); 
textBox.ScrollToHorizontalOffset(rect.Right); 
+0

Intenté llamar a textBox.ScrollToEnd() en GotFocus pero no enfoca el final de la cadena. Configurar CaretIndex solo mueve la posición de intercalación pero no pone esa posición a la vista. Entonces, si mi cuadro de texto contiene más texto del que se puede ajustar y quiero desplazarme hasta el final cada vez que se enfoca, ¿cómo lo haría? Todo lo que tengo en mi pequeña muestra es un solo textBox, Width = "80" y en su método GotFocus probé TextBoxBase.ScrollToEnd, TextBox.CaretIndex, y una combinación de los dos para desplazarme al final de una cadena larga. Si lo hiciste funcionar, ¿puedes publicar una muestra? – Flack

+0

@Flack, ver mi respuesta actualizada –

+0

Gracias. Esto funciona mejor, pero funcionó un poco extraño dependiendo de dónde estaba el último cursor cuando saliste de la caja de texto. Parece que tiene algo que ver con el desplazamiento horizontal del cuadro de texto. Cambié la última línea para leer textBox.ScrollToHorizontalOffset (Math.Max ​​(rect.Right, textBox.HorizontalOffset)); y parece funcionar bien ahora. Gracias por la ayuda. – Flack

2

Esto funcionó para mí.

textBox.CaretIndex = txt.Text.Length; 
textBox.ScrollToEnd(); 
4

Es cierto: la configuración de la propiedad de intercalación del código no afecta a la vista; y el cursor puede salir de la parte visible.

kb_target_box.Focus(); // just for sure 
Rect rect = kb_target_box.GetRectFromCharacterIndex(kb_target_box.CaretIndex); 
kb_target_box.ScrollToHorizontalOffset(Math.Max((kb_target_box.HorizontalOffset + rect.Left - (kb_target_box.ActualWidth - 40)), 0.0)); 

h-scroll seguirá el cursor después de que se acerca más que 40 a la frontera cuadro de texto a la derecha.

+2

Esto funciona para mí y ninguno de los otros funciona. –