C# 检测ScrollViewer何时停止滚动

C# 检测ScrollViewer何时停止滚动,c#,wpf,scroll,scrollviewer,pixelsense,C#,Wpf,Scroll,Scrollviewer,Pixelsense,我有一个SurfaceListBox,里面有一个ScrollViewer。我可以访问ScrollViewer,我想检测滚动何时结束。因为它是一个触摸应用程序,我可以拖动它,现在我正在检测PreviewTouchUp来做我想做的事情,但是,如果我像你在智能手机上那样快速滑动,因为ScrollViewer的内容仍然在拖动/滚动,PreviewTouchUp不会反映滚动的结束,而是在之前触发 我在ScrollViewer和SurfaceListBox上尝试了操纵事件和其他一些事件。我也试过Scroll

我有一个SurfaceListBox,里面有一个ScrollViewer。我可以访问ScrollViewer,我想检测滚动何时结束。因为它是一个触摸应用程序,我可以拖动它,现在我正在检测PreviewTouchUp来做我想做的事情,但是,如果我像你在智能手机上那样快速滑动,因为ScrollViewer的内容仍然在拖动/滚动,PreviewTouchUp不会反映滚动的结束,而是在之前触发

我在ScrollViewer和SurfaceListBox上尝试了操纵事件和其他一些事件。我也试过ScrollViewer.panning,说实话,我看不出有什么不同。基本上,到目前为止没有运气

那么,即使在ScrollViewer中预览了Tuchup之后,我如何才能检测到滚动的结束呢?

你就不能处理这个问题吗?从链接页面上,它说它

检测到滚动位置、范围或视口大小的更改时发生

因此,您可以启动Dispatcher,在每次引发事件时(例如,当事件滚动时)等待一小段时间。当滚动停止且事件停止引发时,将调用Tick处理程序,您可以在其中执行任何操作。试着这样做:

DispatcherTimer timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 0, 0, 250);
timer.Tick += Timer_Tick;

...

private void ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    if (timer.IsEnabled) timer.Stop();
    timer.Start();
}

private void Timer_Tick(object sender, EventArgs e)
{
    timer.Stop();
    // Do what you want now that scrolling has stopped
}
你就不能处理这个问题吗?从链接页面上,它说它

检测到滚动位置、范围或视口大小的更改时发生

因此,您可以启动Dispatcher,在每次引发事件时(例如,当事件滚动时)等待一小段时间。当滚动停止且事件停止引发时,将调用Tick处理程序,您可以在其中执行任何操作。试着这样做:

DispatcherTimer timer = new DispatcherTimer();
timer.Interval = new TimeSpan(0, 0, 0, 0, 250);
timer.Tick += Timer_Tick;

...

private void ScrollChanged(object sender, ScrollChangedEventArgs e)
{
    if (timer.IsEnabled) timer.Stop();
    timer.Start();
}

private void Timer_Tick(object sender, EventArgs e)
{
    timer.Stop();
    // Do what you want now that scrolling has stopped
}

看起来有点混乱,但Sheridan的解决方案是我能找到的确定scrollviewer何时停止移动的最佳方法。我刚刚调整了计时器间隔,更重要的是,现在在scrollviewer控件上的hittestvisible=false和hittestvisible=true之间停止了滚动,因此我将//Do what you want置于滚动状态。虽然看起来有点混乱,但Sheridan的解决方案是确定scrollviewer何时停止移动的最佳方法。我刚刚调整了计时器间隔,更重要的是,在scrollviewer控件上的hittestvisible=false和hittestvisible=true之间停止了滚动,因此我将//Do you Way置于滚动状态。

虽然最终目的相同,但该问题的答案使用鼠标滚轮事件,并且由于我使用触摸进行交互,这不适用。好吧,这很公平。。。我将撤回接近投票。虽然最终目的相同,但该问题的答案使用鼠标滚轮事件,而且由于我使用触摸进行交互,因此不适用。好吧,这很公平。。。我将收回投票结果。谢谢谢里丹,它解决了我的问题,尽管它本身还不够,我只需要添加一个标志来检测用户何时没有触摸,比如定时器滴答{Timer.Stop;if!\u touchtdown//在这里做些什么…}也许你可以用这个更改更新你的答案。谢谢谢里丹,它解决了我的问题,虽然它本身还不够,但我只需要添加一个标志来检测用户何时没有触摸,比如Timer\u Tick{Timer.Stop;if!\u touchtdown//do some here…}也许你可以用这个更改更新你的答案。