2012-10-02 7 views
8

mi chiedo qual è il miglior approccio per rilevare se uno ScrollViewer raggiunge il fondo, a destra eccCome rilevare se lo spettatore di scorrimento raggiunge fondo in WinRT

penso di poter ottenere che utilizzando sia PointerWheelChanged per il mouse e ManipulationDelta per il tocco. In questi event handler, posso registrare HorizontalOffset per scoprire quando lo scroller raggiungerà la fine. Ma penso che ci potrebbe essere un modo migliore per farlo.

Ho trovato questo article. Ma gli stati visivi di compressione sembrano non funzionare in winrt. Il metodo di evento CurrentStateChanging non viene chiamato.

Ho anche controllato un altro article. Ma funziona solo per scroll bar, non per un approccio generico.

Qualcuno sa qual è il modo migliore per risolvere questo problema?

risposta

17

XAML:

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

codice dietro:

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

Inoltre ho controllato questo metodo. Anche se il problema non funzionerà se il contenuto non è più lungo di uno schermo. – Selkie

+0

Buon punto! Aggiornamento della risposta. –

+0

Grazie per l'aggiornamento. Ma penso che in realtà non verrà chiamato in questa situazione. – Selkie

3

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

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