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

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


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