7 votes

Défilement jusqu'à la fin d'une TextBox WPF d'une seule ligne

Cela semble si simple, mais je n'arrive pas à le faire fonctionner.

J'ai une zone de texte à une ligne qui contient beaucoup de texte. Ce que je veux, c'est qu'à chaque fois que la zone de texte reçoit le focus, elle défile jusqu'à la fin du texte de façon à ce qu'il soit visible et que le curseur se trouve à la fin, prêt à accepter un nouveau texte.

Dans l'événement GotFocus de la zone de texte, j'appelle textBox.ScrollToEnd(). Il semble que cela ne fasse que déplacer le curseur jusqu'à la fin de la zone de texte, sans pour autant faire apparaître la fin.

Qu'est-ce que je rate ?

22voto

Thomas Levesque Points 141081

Vous devriez être en mesure de le faire en utilisant ces membres :


EDIT : je ne sais pas pourquoi ScrollToEnd ne fonctionne pas... Quoi qu'il en soit, ce code fonctionne :

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

5voto

Eugeny Points 51

C'est vrai - la définition de la propriété caret à partir du code n'affecte pas la vue ; et le caret peut aller en dehors de la partie 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 suivra le caret lorsqu'il s'approchera à moins de 40 de la bordure droite de la TextBox.

3voto

user892381 Points 656

Cela a marché pour moi.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X