c# - ¿Detecta cuándo la barra de desplazamiento de la lista de WPF está en la parte inferior?
listview scroll (3)
¿Hay alguna manera de detectar si la barra de desplazamiento del ScrollViewer
en un ListView
ha llegado al fondo del espacio de desplazamiento virtual? Me gustaría detectar esto para obtener más elementos del servidor para ponerlos en la ObservableCollection
enlazada en el ListView
.
En este momento estoy haciendo esto:
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!");
}
}
¿Esto es incluso correcto? También necesito diferenciar entre la barra de desplazamiento vertical que causa el evento y la barra de desplazamiento horizontal que lo causa (es decir, no deseo seguir generando llamadas al servidor si se desplaza horizontalmente en la parte inferior del cuadro).
Gracias.
Me lo imaginé. Parece que debería haber estado obteniendo eventos de ScrollBar ( <ListView ScrollBar.Scroll="currentTagNotContactsList_Scroll"
en XAML), en lugar de hacerlo en el visor. Esto funciona, pero solo tengo que encontrar una forma de evitar que el controlador de eventos sea llamado repetidamente una vez que la barra de desplazamiento esté baja. Tal vez un temporizador sería bueno:
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!");
}
}
//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
}
}
}
Para UWP lo tengo así
<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;
}