2016-05-06 1 views
0

Permettez-moi d'expliquer ce que mon exigence est, tout d'abord, voici un formulaire avec 50 champs, au début, le curseur est dans la première zone de texte sur le terrain:WPF - Comment défiler automatiquement scrollviewer quand il faut faire défiler?

enter image description here

Quand je rempli 10 champs, curseur sera désormais en Field11:

enter image description here

maintenant, je veux que le défilement autoscroll à un endroit comme celui-ci quand je me suis concentré dans Field11 pour plus de vue:

Donc, si quelqu'un comprend de quoi je parle, pourriez-vous s'il vous plaît m'aider à résoudre ce problème? Merci!

+0

Je ne sais pas comment faire exactement. Mais pourquoi le programme effectue-t-il un défilement automatique lorsqu'il atteint 'field'11', mais pas quand il atteint' field002'? Est-ce qu'il doit détecter si c'est dans le fond le plus? – Ian

+0

@Ian oui, il doit détecter si elle est dans le fond, car le client veut voir plus de champs lors du remplissage du champ inférieur sur l'écran. –

Répondre

1

Vous pouvez utiliser ScrollChangedEventArgs.ExtentHeightChange pour savoir si un ScrollChanged est dû à une modification du contenu ou à une action de l'utilisateur ... Lorsque le contenu est inchangé, la position ScrollBar active ou désactive le mode autoscroll. Lorsque le contenu a changé, vous pouvez appliquer le défilement automatique.

code derrière:

private Boolean AutoScroll = true; 

private void ScrollViewer_ScrollChanged(Object sender, ScrollChangedEventArgs e) 
{ 
    // User scroll event : set or unset autoscroll mode 
    if (e.ExtentHeightChange == 0) 
    { // Content unchanged : user scroll event 
     if (ScrollViewer.VerticalOffset == ScrollViewer.ScrollableHeight) 
     { // Scroll bar is in bottom 
      // Set autoscroll mode 
      AutoScroll = true; 
     } 
     else 
     { // Scroll bar isn't in bottom 
      // Unset autoscroll mode 
      AutoScroll = false; 
     } 
    } 

    // Content scroll event : autoscroll eventually 
    if (AutoScroll && e.ExtentHeightChange != 0) 
    { // Content changed and autoscroll mode set 
     // Autoscroll 
     ScrollViewer.ScrollToVerticalOffset(ScrollViewer.ExtentHeight); 
    } 
}