2009-08-19 9 views
9

Gibt es eine Möglichkeit festzustellen, ob die Bildlaufleiste von ScrollViewer in einem ListView den unteren Rand des virtuellen Bildlaufbereichs erreicht hat? Ich möchte dies erkennen, um weitere Elemente vom Server zu holen, um in den gebundenen ObservableCollection auf dem ListView zu setzen.Erkennen, wenn WPF listview Bildlaufleiste am unteren Rand ist?

Im Moment bin ich dies zu tun:

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

} 

Ist das auch richtig? Ich muss auch zwischen der vertikalen Bildlaufleiste, die das Ereignis verursacht, und der horizontalen Bildlaufleiste, die das verursacht, unterscheiden (d. H. Ich möchte nicht weiter Aufrufe an den Server generieren, wenn Sie horizontal am unteren Rand der Box blättern).

Danke.

Antwort

8

Ich fand es heraus. Es scheint, ich hätte lieber selbst Ereignisse von der ScrollBar (<ListView ScrollBar.Scroll="currentTagNotContactsList_Scroll" in XAML) bekommen als vom Viewer. Das funktioniert, aber ich muss nur einen Weg finden, um zu vermeiden, dass der Ereignishandler wiederholt aufgerufen wird, wenn die Bildlaufleiste nicht aktiv ist. Vielleicht wäre ein Timer gut sein:

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 existiert nicht für Listview in Windows 10 .. wie diese Anforderung zu erreichen in Fenster 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

Für UWP habe ich es wie dieses

<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; 
} 
Verwandte Themen