2009-08-19 6 views
9

C'è un modo per rilevare se la barra di scorrimento da ScrollViewer in un ListView ha raggiunto la parte inferiore dello spazio di scorrimento virtuale? Vorrei rilevare questo per recuperare più elementi dal server per mettere nel limite ObservableCollection su ListView.Rileva quando la barra di scorrimento di listview WPF si trova nella parte inferiore?

In questo momento mi sto facendo questo:

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!"); 
    } 

} 

Questo è anche corretto? Devo anche distinguere tra la barra di scorrimento verticale che causa l'evento e la barra di scorrimento orizzontale che la causa (ad esempio, non voglio continuare a generare chiamate al server se scorri orizzontalmente nella parte inferiore della finestra).

Grazie.

risposta

8

L'ho capito. Sembra che avrei dovuto ricevere eventi dalla ScrollBar (<ListView ScrollBar.Scroll="currentTagNotContactsList_Scroll" in XAML) anziché dal visualizzatore. Funziona, ma devo solo immaginare un modo per evitare che il gestore di eventi venga chiamato ripetutamente dopo che la barra di scorrimento è chiusa. Forse un timer sarebbe bene:

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 non esiste per ListView in Windows 10 .. come raggiungere questo requisito Windows 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

Per UWP ho preso come questo

<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; 
} 
Problemi correlati