【问题标题】:How to detect if the scroll viewer reaches bottom in winrt如何检测滚动查看器是否在winrt中到达底部
【发布时间】:2012-10-02 00:41:40
【问题描述】:

我想知道检测 ScrollViewer 是否到达底部、右侧等的最佳方法是什么。

我想我可以通过同时使用 PointerWheelChanged 和 ManipulationDelta 来实现这一点。在这些事件处理程序中,我可以记录 Horizo​​ntalOffset 以了解滚动条何时到达终点。但我认为可能有更好的方法来做到这一点。

我找到了这个article。但是压缩视觉状态似乎在 winrt 中不起作用。未调用 CurrentStateChanging 事件方法。

我还检查了另一个article。但它只适用于滚动条,而不是通用方法。

有谁知道解决这个问题的最佳方法是什么?

【问题讨论】:

    标签: c# xaml windows-runtime


    【解决方案1】:

    XAML:

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

    后面的代码:

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

    【讨论】:

    • 我也检查了这个方法。如果内容不超过一屏,则问题将无法解决。
    • 感谢您的更新。但我认为在这种情况下它实际上不会被调用。
    • 不过没关系,那么就假设你在列表的末尾。
    • 或等待列表首先填充,然后再进行任何检查。
    • 获取 ScrollViewer 的指针和操作事件是出了名的难以捉摸,您需要同时使用鼠标和触摸输入对其进行测试以查看差异。您可以将内容修改为具有 MinimumHeight 以便在有帮助的情况下始终可以滚动...
    【解决方案2】:

    对于 UWP,我是这样理解的

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

    【讨论】:

    • 这是一个很好的答案。我在过去的两天里一直在寻找这个。这很简单。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多