31

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?

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 Answers2

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
  • 1
    I 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