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

后端 未结 2 512
醉话见心
醉话见心 2020-11-30 06:13

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?

相关标签:
2条回答
  • 2020-11-30 07:14

    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"); 
    }
    
    0 讨论(0)
  • 2020-11-30 07:20

    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;
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题