C# 如何在winrt中检测滚动查看器是否到达底部

C# 如何在winrt中检测滚动查看器是否到达底部,c#,xaml,windows-runtime,C#,Xaml,Windows Runtime,我想知道检测ScrollViewer是否到达底部的最佳方法是什么,等等 我想我可以通过使用鼠标指针和触摸操作Delta来实现这一点。在这些事件处理程序中,我可以记录HorizontalOffset以了解滚动条何时到达终点。但我认为还有更好的方法 我找到了这个。但是压缩可视状态在winrt中似乎不起作用。未调用CurrentStateChanging事件方法 我还查了另一个。但它只适用于滚动条,而不是一般的方法 有人知道解决这个问题的最佳方法是什么吗?XAML: <ScrollViewer

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

我想我可以通过使用鼠标指针和触摸操作Delta来实现这一点。在这些事件处理程序中,我可以记录HorizontalOffset以了解滚动条何时到达终点。但我认为还有更好的方法

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

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

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

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);
    }
}
private void onScrollViewServiceChanged(对象发送方,ScrollViewServiceChangedEventArgs e)
{
var垂直偏移=sv垂直偏移;
var maxVerticalOffset=sv.ScrollableHeight;//sv.ExtentHeight-sv.ViewportHeight;
如果(最大垂直偏移量<0||
垂直偏移==最大垂直偏移)
{
//滚动到底部
rect.Fill=新的SolidColorBrush(Colors.Red);
}
其他的
{
//没有滚动到底部
rect.Fill=新的SolidColorBrush(Colors.Yellow);
}
}

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

private void scroll_ViewChanged(对象发送者,ScrollViewerviceWChangedEventArgs e)
{
var scrollViewer=(scrollViewer)发送方;
if(scrollViewer.VerticalOffset==scrollViewer.ScrollableHeight)
BTNNEWUpdate.Visibility=可见性.Visibility;
}
私有void btnNewUpdates\u单击(对象发送方,路由目标)
{
itemGridView.ScrollIntoView(itemGridView.Items[0]);
btnNewUpdates.Visibility=可见性。已折叠;
}

我也检查了这个方法。虽然问题是,如果内容不超过一个屏幕,它将无法工作。感谢更新。但我认为在这种情况下它实际上不会被调用。但没关系,然后,假设您位于列表的末尾。或者等待列表首先填充,然后再进行任何检查。获取ScrollViewer的指针和操作事件是众所周知的难以捉摸的事情,您需要使用鼠标和触摸输入对其进行测试,以查看差异。您可以修改您的内容,使其具有最小高度,以便始终可以滚动,如果这有帮助的话…这是一个很好的答案。在过去的两天里我一直在寻找这个。这很简单。谢谢你的帮助。