How to find that ScrollViewer is scrolled to the end in WPF?

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?


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"); 
}

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;
    }

}