2014-02-05 82 views
1

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

ScrollViewer停止滚动时检测

我试图Manipulation事件和其他几个人在ScrollViewerSurfaceListBox两者。我也试过ScrollViewer.PanningDeceleration,说实话,我没有看到区别。基本上,到目前为止没有运气。

那么,如何检测滚动的结束,即使在PreviewTouchUpScrollViewer之后?

+0

尽管最终目的是相同的,但对该问题的回答使用了'MouseWheel'事件,并且因为我使用'Touch'进行交互,所以它不适用。 –

+0

好吧,这很公平......我会收回近距离投票。 – Sheridan

回答

3

难道你不能只处理ScrollViewer.ScrollChanged event?从链接页面,它表示它...

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

所以你可以开始一个DispatcherTimer等待一个短暂的瞬间,每次事件发生后,例如。当它滚动时。当滚动停止并且事件停止时,那么将调用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 
} 
+1

谢谢谢里登,它解决了我的问题,虽然它本身还不够,我只需要添加一个标志来检测用户没有触摸,像'Timer_Tick {timer.Stop();如果(!_ touchDown)//在这里做某事......}也许你可以用这个改变来更新你的答案。 –

0

似乎有点混乱,但谢里登的解决方案是我能找到确定何时ScrollViewer中停止移动的最佳方式。我只是调整了计时器间隔,更重要的是,在scrollviewer控件的hittestvisible = false和hittestvisible = true之间放置了“//做你想要的滚动停止”。