我想订阅一个事件,告诉我滚动已经在ListView中启动并获得滚动方向。
有没有办法在Windows 10 UWP API中执行此操作?
由于
答案 0 :(得分:4)
您应首先obtain ScrollViewer
内的ListView
,然后订阅其DirectManipulationStarted
事件。
然而,要获得滚动的方向可能会很棘手。我建议您查看新的Windows Composition API,然后使用ExpressionAnimation
将ScrollViewer
的翻译链接到您的值选择。
一个好的开始是看看詹姆斯克拉克的这个demo。
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);
}
实际上只是想到了一种更简单的方法来检测滚动方向。只要在VerticalOffset
发生变化时订阅,并将其与之前的值进行比较。
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;
});