2009-08-19 7 views
9

Existe-t-il un moyen de détecter si la barre de défilement ScrollViewer dans un ListView a atteint le bas de l'espace de défilement virtuel? Je voudrais détecter cela pour aller chercher plus d'éléments du serveur pour mettre dans la limite ObservableCollection sur le ListView.Détecter lorsque la barre de défilement de la liste de contrôle WPF est en bas?

En ce moment je fais ceci:

private void currentTagNotContactsList_scrollChanged(object sender, ScrollChangedEventArgs e) { 

    ListView v = (ListView)sender; 


    if (e.VerticalOffset + e.ViewportHeight == e.ExtentHeight) { 
     Debug.Print("At the bottom of the list!"); 
    } 

} 

Est-ce même correct? J'ai également besoin de faire la différence entre la barre de défilement verticale provoquant l'événement et la barre de défilement horizontale provoquant cela (c'est-à-dire que je ne veux pas continuer à générer des appels au serveur si vous faites défiler horizontalement au bas de la boîte).

Merci.

Répondre

8

Je l'ai compris. Il semble que j'aurais dû obtenir des événements du ScrollBar (<ListView ScrollBar.Scroll="currentTagNotContactsList_Scroll" dans XAML) lui-même, plutôt que le spectateur. Cela fonctionne, mais je dois juste trouver un moyen d'éviter que le gestionnaire d'événements soit appelé à plusieurs reprises une fois que la barre de défilement est en panne. Peut-être une minuterie serait bon:

private void currentTagNotContactsList_Scroll(object sender, ScrollEventArgs e) { 

    ScrollBar sb = e.OriginalSource as ScrollBar; 

    if (sb.Orientation == Orientation.Horizontal) 
     return; 

    if (sb.Value == sb.Maximum) { 
     Debug.Print("At the bottom of the list!"); 

    } 

} 
+2

ScrollBar.Scroll n'existe pas pour ListView dans Windows 10 .. comment atteindre cette exigence fenêtres 10 – djkp

1
//A small change in the "Max's" answer to stop the repeatedly call. 
//this line to stop the repeatedly call 
ScrollViewer.CanContentScroll="False" 

private void dtGrid_ScrollChanged(object sender, ScrollChangedEventArgs e) 
       { 
//this is for vertical check & will avoid the call at the load time (first time) 
        if (e.VerticalChange > 0) 
        { 
         if (e.VerticalOffset + e.ViewportHeight == e.ExtentHeight) 
         { 
          // Do your Stuff 
         } 
        } 
       } 
0

Pour UWP je l'ai eu comme ça

<ScrollViewer Name="scroll" ViewChanged="scroll_ViewChanged"> 
    <ListView /> 
</ScrollViewer> 

private void scroll_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e) 
{ 
    var scrollViewer = (ScrollViewer)sender; 
    if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight) 
      btnNewUpdates.Visibility = Visibility.Visible; 
} 
Questions connexes