I have a ScrollViewer
instance in my custom control... I need the requirement that whether scorollview is scrolled to the End? Is there any way?
Asked
Active
Viewed 2.0k times
31

David Bekham
- 2,175
- 3
- 27
- 56
-
perhaps this helps http://stackoverflow.com/questions/5809096/detect-end-of-scrollview-programatically-in-silverlight – Klaus78 May 29 '12 at 07:23
2 Answers
56
You can check this with this way:
...
scrollViewer.ScrollChanged += OnScrollChanged;
...
private void OnScrollChanged(object sender, ScrollChangedEventArgs e)
{
var scrollViewer = (ScrollViewer)sender;
if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight)
MessageBox.Show("This is the end");
}

David Blurton
- 150
- 1
- 9

Catherine
- 644
- 6
- 11
-
1I was looking of an MVVM solution, but I could slap this into an attached property. When I have it working, maybe I'll post the code here. – Jordan Apr 07 '15 at 18:53
8
Here is my MVVM-friendly version:
public static class ScrollHelper
{
public static readonly DependencyProperty ScrollToBottomProperty = DependencyProperty.RegisterAttached("ScrollToBottom", typeof(ICommand), typeof(ScrollHelper), new FrameworkPropertyMetadata(null, OnScrollToBottomPropertyChanged));
public static ICommand GetScrollToBottom(DependencyObject ob)
{
return (ICommand) ob.GetValue(ScrollToBottomProperty);
}
public static void SetScrollToBottom(DependencyObject ob, ICommand value)
{
ob.SetValue(ScrollToBottomProperty, value);
}
private static void OnScrollToBottomPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var scrollViewer = obj as ScrollViewer;
scrollViewer.Loaded += OnScrollViewerLoaded;
}
private static void OnScrollViewerLoaded(object sender, RoutedEventArgs e)
{
(sender as ScrollViewer).Loaded -= OnScrollViewerLoaded;
(sender as ScrollViewer).Unloaded += OnScrollViewerUnloaded;
(sender as ScrollViewer).ScrollChanged += OnScrollViewerScrollChanged;
}
private static void OnScrollViewerScrollChanged(object sender, ScrollChangedEventArgs e)
{
var scrollViewer = (ScrollViewer)sender;
if (scrollViewer.VerticalOffset >= scrollViewer.ScrollableHeight)
{
var command = GetScrollToBottom(sender as ScrollViewer);
if (command == null || !command.CanExecute(null))
return;
command.Execute(null);
}
}
private static void OnScrollViewerUnloaded(object sender, RoutedEventArgs e)
{
(sender as ScrollViewer).Unloaded -= OnScrollViewerUnloaded;
(sender as ScrollViewer).ScrollChanged -= OnScrollViewerScrollChanged;
}
}

Jordan
- 9,642
- 10
- 71
- 141