Je souhaite m’abonner à un événement qui m’indique que le défilement a commencé dans un ListView et indique le sens du défilement.
Est-il possible de le faire dans Windows 10 UWP API?
Merci
Vous devez d’abord obtenir le ScrollViewer
dans ListView
, puis vous abonner à son événement DirectManipulationStarted
.
Cependant, obtenir le sens du défilement peut être délicat. Je vous ScrollViewer
consulter la nouvelle API de composition Windows, où il existe un moyen d’utiliser ExpressionAnimation
pour lier la ScrollViewer
de ScrollViewer
à une valeur de votre choix.
Pour commencer, jetez un coup d’œil à cette démo de James Clarke.
private void MainPage_Loaded(object sender, RoutedEventArgs e) { CompositionPropertySet scrollerViewerManipulation = ElementCompositionPreview.GetScrollViewerManipulationPropertySet(myScroller); Compositor compositor = scrollerViewerManipulation.Compositor; ExpressionAnimation expression = compositor.CreateExpressionAnimation("ScrollManipululation.Translation.Y * ParallaxMultiplier"); expression.SetScalarParameter("ParallaxMultiplier", 0.3f); expression.SetReferenceParameter("ScrollManipululation", scrollerViewerManipulation); Visual textVisual = ElementCompositionPreview.GetElementVisual(background); textVisual.StartAnimation("Offset.Y", expression); }
En fait, je viens de penser à un moyen plus simple de détecter la direction de défilement. Il suffit de s’abonner chaque fois que le VerticalOffset
est modifié et de le comparer à ses valeurs précédentes.
private double _previousOffset; sv.RegisterPropertyChangedCallback(ScrollViewer.VerticalOffsetProperty, (s, dp) => { if (Math.Abs(sv.VerticalOffset - _previousOffset ) < 3) { // ignore when offset difference is too small } else if (sv.VerticalOffset > _previousOffset) { Debug.WriteLine($"up {sv.VerticalOffset - _previousOffset}"); } else { Debug.WriteLine($"down {sv.VerticalOffset - _previousOffset}"); } _previousOffset = sv.VerticalOffset; });