Detect when ScrollViewer has stopped scrolling
c#, pixelsense, scroll, scrollviewer, wpf
Solution
Can't you just handle the `ScrollViewer.ScrollChanged` event? From the linked page, it says that it...
Occurs when changes are detected to the scroll position, extent, or viewport size.
So you could just start a `DispatcherTimer` to wait for a short instant each time the event has been raised, eg. when it is scrolling. When the scrolling stops and the event stops being raised, then the `Tick` handler will be called and you can do whatever you like in it. Try something like this:
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
}
Problem
I have a `SurfaceListBox` that inside has a `ScrollViewer`. I have access to that `ScrollViewer` and I want to detect when the scrolling ends. Since it is a touch app and I can drag it, right now I'm detecting the `PreviewTouchUp` to do what I want, however, if I do a fast swipe, like you would do on a smartphone, because the content of the `ScrollViewer` is still dragging/scrolling, the `PreviewTouchUp` does not reflect the end of the scrolling, but is instead triggered before. I have tried `Manipulation` events and several others on both the `ScrollViewer` and the `SurfaceListBox`. I have also tried `ScrollViewer.PanningDeceleration` and honestly, I don't see a difference. Basically, no luck so far. So, how can I detect the end of the scrolling, even after the `PreviewTouchUp` in a `ScrollViewer`?