如何在UWP中捕获GridView中的Scroll事件

时间:2016-12-13 22:08:40

标签: c# xaml gridview uwp

我有带有绑定集合的GridView。我想在用户滚动GridView时捕获滚动更改事件。

如何在UWP中捕获GridView中的Scroll事件?

1 个答案:

答案 0 :(得分:2)

您需要访问GridView模板中的ScrollViewer,以便为其ViewChanged事件添加侦听器。

你应该总是在你的武器库中有一个帮助方法来搜索可视树中的控件,如:

public static class ViewHelper
{
    public static IEnumerable<DependencyObject> ChildrenBreadthFirst(this DependencyObject obj, bool includeSelf = false)
    {
        if (includeSelf)
        {
            yield return obj;
        }

        var queue = new Queue<DependencyObject>();
        queue.Enqueue(obj);

        while (queue.Count > 0)
        {
            obj = queue.Dequeue();
            var count = VisualTreeHelper.GetChildrenCount(obj);

            for (var i = 0; i < count; i++)
            {
                var child = VisualTreeHelper.GetChild(obj, i);
                yield return child;
                queue.Enqueue(child);
            }
        }
    }
}

现在您可以像这样访问ScrollViewer(简化代码):

<Page Loaded="onPageLoaded">
    <GridView x:Name="gridView"/>
</Page>
private void onPageLoaded(object sender, RoutedEventArgs e)
{
    var scrollViewer = gridView.ChildrenBreadthFirst().OfType<ScrollViewer>().First();
    scrollViewer.ViewChanged += onViewChanged;
}

private void onViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
    System.Diagnostics.Debug.WriteLine("Scrolled");
}

您必须等到模板实现ScrollViewer的Loaded事件(Page.LoadedGridView.Loaded会这样做)我通常只使用Page.Loaded一切)。

如果您需要跨多个控件执行此操作,您可能希望将其捆绑为可重用的行为。