How to scroll to the bottom of a ScrollViewer automatically with Xaml and binding?

前端 未结 6 1592
一生所求
一生所求 2020-12-01 05:57

I\'ve got a TextBlock whose content is data bound to a string property of the ViewModel. This TextBlock has a ScrollViewer wrapped aro

6条回答
  •  自闭症患者
    2020-12-01 06:48

    Here is a slight variation.

    This will scroll to the bottom both when the scroll viewer height (viewport) and the height of it's scroll presenter's content (extent) change.

    It's based on Roy T's answer but I wasn't able to comment so I have posted as an answer.

        public static class AutoScrollHelper
        {
            public static readonly DependencyProperty AutoScrollProperty =
                DependencyProperty.RegisterAttached("AutoScroll", typeof(bool), typeof(AutoScrollHelper), new PropertyMetadata(false, AutoScrollPropertyChanged));
    
    
            public static void AutoScrollPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
            {
                var scrollViewer = obj as ScrollViewer;
                if (scrollViewer == null) return;
    
                if ((bool) args.NewValue)
                {
                    scrollViewer.ScrollChanged += ScrollViewer_ScrollChanged;
                    scrollViewer.ScrollToEnd();
                }
                else
                {
                    scrollViewer.ScrollChanged -= ScrollViewer_ScrollChanged;
                }
            }
    
            static void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
            {
                // Remove "|| e.ViewportHeightChange < 0 || e.ExtentHeightChange < 0" if you want it to only scroll to the bottom when it increases in size
                if (e.ViewportHeightChange > 0 || e.ExtentHeightChange > 0 || e.ViewportHeightChange < 0 || e.ExtentHeightChange < 0)
                {
                    var scrollViewer = sender as ScrollViewer;
                    scrollViewer?.ScrollToEnd();
                }
            }
    
            public static bool GetAutoScroll(DependencyObject obj)
            {
                return (bool) obj.GetValue(AutoScrollProperty);
            }
    
            public static void SetAutoScroll(DependencyObject obj, bool value)
            {
                obj.SetValue(AutoScrollProperty, value);
            }
        }
    

提交回复
热议问题