2012-10-02 3 views
8

me pregunto ¿cuál es el mejor método para detectar si un ScrollViewer llega al fondo, a la derecha, etc.cómo detectar si el espectador de desplazamiento alcanza inferior en WinRT

Creo que puedo lograr que mediante el uso tanto para el ratón PointerWheelChanged y ManipulationDelta para tocar. En estos controladores de eventos, puedo grabar el HorizontalOffset para saber cuándo llegará el finalizador al final. Pero creo que podría haber una mejor manera de hacerlo.

He encontrado article. Pero los estados visuales de compresión parecen no funcionar en winrt. El método de evento CurrentStateChanging no se está llamando.

También verifiqué otra article. Pero solo funciona para la barra de desplazamiento, no es un enfoque genérico.

¿Alguien sabe cuál es la mejor manera de resolver este problema?

Respuesta

17

XAML:

<ScrollViewer 
    x:Name="sv" 
    ViewChanged="OnScrollViewerViewChanged"> 
    <Rectangle 
     x:Name="rect" 
     Width="2000" 
     Height="2000" 
     Fill="Yellow" 
     Margin="10" /> 
</ScrollViewer> 

Código atrás:

private void OnScrollViewerViewChanged(object sender, ScrollViewerViewChangedEventArgs e) 
{ 
    var verticalOffset = sv.VerticalOffset; 
    var maxVerticalOffset = sv.ScrollableHeight; //sv.ExtentHeight - sv.ViewportHeight; 

    if (maxVerticalOffset < 0 || 
     verticalOffset == maxVerticalOffset) 
    { 
     // Scrolled to bottom 
     rect.Fill = new SolidColorBrush(Colors.Red); 
    } 
    else 
    { 
     // Not scrolled to bottom 
     rect.Fill = new SolidColorBrush(Colors.Yellow); 
    } 
} 
+1

También comprobé este método. Aunque el problema no funcionará si el contenido no es más largo que una pantalla. – Selkie

+0

¡Buen punto! Actualizando la respuesta. –

+0

Gracias por la actualización. Pero creo que en realidad no se llamará en esta situación. – Selkie

3

Para uwp lo tengo como esto

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

private void btnNewUpdates_Click(object sender, RoutedEventArgs e) 
{ 
    itemGridView.ScrollIntoView(itemGridView.Items[0]); 
    btnNewUpdates.Visibility = Visibility.Collapsed; 
} 
Cuestiones relacionadas