如何在Windows 10 UWP上的ListView中检测何时开始滚动?

时间:2016-01-27 22:11:30

标签: c# windows-mobile uwp windows-10-universal

我想订阅一个事件,告诉我滚动已经在ListView中启动并获得滚动方向。

有没有办法在Windows 10 UWP API中执行此操作?

由于

1 个答案:

答案 0 :(得分:4)

您应首先obtain ScrollViewer内的ListView,然后订阅其DirectManipulationStarted事件。

然而,要获得滚动的方向可能会很棘手。我建议您查看新的Windows Composition API,然后使用ExpressionAnimationScrollViewer的翻译链接到您的值选择。

一个好的开始是看看詹姆斯克拉克的这个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;
});
相关问题