Xaml 检测ListView中滚动的结束

Xaml 检测ListView中滚动的结束,xaml,listview,windows-runtime,windows-phone-8.1,win-universal-app,Xaml,Listview,Windows Runtime,Windows Phone 8.1,Win Universal App,此处是通用Windows 8.1存储项目 我想知道,在用户交互之后,ListView何时停止滚动。我在网上找到了大量的信息,但没有一个例子能够可靠地在WP8.1上工作(WPF/WP8的例子没有多大帮助,而且有很多) 这就是我现在要做的 1.列表视图 这在某种程度上确实有效 问题 问题是,当列表滚动到结束/开始时,ViewChanged没有被激发,用户将其拉出边界并释放,导致它以惯性返回。因此,检测到交互开始,但未检测到交互结束ViewChanged根本不会被激发——既不使用IsIntermedi

此处是通用Windows 8.1存储项目

我想知道,在用户交互之后,ListView何时停止滚动。我在网上找到了大量的信息,但没有一个例子能够可靠地在WP8.1上工作(WPF/WP8的例子没有多大帮助,而且有很多)

这就是我现在要做的

1.列表视图 这在某种程度上确实有效

问题 问题是,当列表滚动到结束/开始时,
ViewChanged
没有被激发,用户将其拉出边界并释放,导致它以惯性返回。因此,检测到交互开始,但未检测到交互结束
ViewChanged
根本不会被激发——既不使用
IsIntermediate
=True,也不使用False


做我想做的事情有什么更好的方法?

遗憾的是,除了重复轮询和检查滚动偏移量之外,在Windows 8.1上没有更好的方法


我刚得到一个10倍的数组,每秒大约10次,我在当前滚动偏移量中移动。而不是在同一个处理程序中检查最后5个是否等于列表的末尾,然后引发一个事件。

正如塔马斯·德梅所说,没有好的方法来做需要做的事情。然而,我已经找到了一个在我的案例中有效的解决方法(尽管没有什么好处)

事实上,我正在检测列表是否在滚动停止时滚动到底部。它检测到滚动的结束是造成这么多麻烦的原因

问题有两个部分:1-检测用户交互的结束,2-检测惯性的结束。令人惊讶的是,没有解决这两个问题的好方法。谢天谢地,当滚动(用户驱动或惯性动画)停止时,我真正需要的只是知道垂直偏移的值。我实际上不必知道用户是否仍然持有列表

void MessageList\u OnPointerEntered(对象发送方,PointerRoutedEventArgs e)
{
IsScrolledToLastLine=false;//这是为了表示用户
//拿着名单,一定没有
//自动滚动,当内容是
//加上。
Debug.WriteLine(“[*]开始监视交互”);
Scroll.ViewChanged+=onviewchangedbyser;
Scroll.LayoutUpdated+=onscrollllayoutupdated;
}
void OnScrollLayoutUpdated(对象发送方,对象e)
{
//将在滚动期间触发多次
//及
//将在惯性最终停止时触发
//(不考虑垂直偏移的变化)
IsCrolledToLastline=Scroll.ScrollableHeight==Scroll.VerticalOffset;
WriteLine(“交互进度:{0}”,IsScrolledToLastLine);
}
void OnViewChangedByUser(对象发送者,ScrollViewServiceChangedEventArgs e)
{
如果(!e.IsIntermediate){
IsCrolledToLastline=Scroll.ScrollableHeight==Scroll.VerticalOffset;
WriteLine(“交互结束:{0}”,IsScrolledToLastLine);
Scroll.LayoutUpdated-=onscrollllayoutupdated;
Scroll.ViewChanged-=onviewchangedbyser;
}
}
Scroll.LayoutUpdated
LayoutUpdated
在滚动过程中多次触发。与
ViewChanged
不同,在帖子图片所示的情况下惯性停止时,也会触发此事件。不幸的是,无法在
LayoutUpdated
中确定列表是否完全停止滚动

ViewChanged
在通过滚动实际更改垂直偏移量时工作正常<代码>布局更新涵盖了过度滚动的情况


不过还有另一个问题:
OnScrollLayoutUpdated
在滚动列表边缘时可能会保持订阅状态,因为不会触发
ViewChanged
。幸运的是,我可以忽略这一点,这并没有破坏任何东西。

8.1是一个令人头疼的问题(感谢您的回复,至少我知道我没有忽略api中的某些内容。不过,检查滚动偏移量没有帮助。在上图中所示的情况下,它不会改变。嗯。我想到了一个解决方法,使用
滚动查看器。LayoutUpdated
。它在滚动期间触发,在滚动时也会触发几次。)用户发布列表后,ertia停止。这仍然很尴尬。
<ListView  
    x:Name="MessageList"
    ItemsSource="{Binding Messages}"  
    VerticalAlignment="Bottom"                
    ItemContainerStyle="{StaticResource ChatListViewItemStyle}" 
    PointerEntered="MessageList_OnPointerEntered"
    >
    <ListView.ItemTemplate>
        <DataTemplate>
            <messages:MessageContainer />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
// GetChildElement<T>(this DependencyObject root) is a simple extension method of mine
Scroll = MessageList.GetChildElement<ScrollViewer>();
void MessageList_OnPointerEntered(object sender, PointerRoutedEventArgs e)
{
    Debug.WriteLine("START MONITORING INTERACTION");
    Scroll.ViewChanged += OnViewChangedByUser;
}

void OnViewChangedByUser(object sender, ScrollViewerViewChangedEventArgs e)
{
  Debug.WriteLine("WAITING FOR INTERACTION TO END");
  if (!e.IsIntermediate) {
    Debug.WriteLine("INTERACTION ENDED");
    Scroll.ViewChanged -= OnViewChangedByUser;
  }
}