2014-02-05 123 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之間放置了「//做你想要的滾動停止」。