using System; using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; namespace EleCho.WpfSuite { /// /// ScrollViewer Utilities /// public static class ScrollViewerUtils { /// /// Get value of VerticalOffset property /// /// /// public static double GetVerticalOffset(DependencyObject d) { if (d is ScrollViewer sv) { return sv.VerticalOffset; } else if (d is ScrollContentPresenter scp) { return scp.VerticalOffset; } return (double)d.GetValue(VerticalOffsetProperty); } /// /// Set value of VerticalOffset property /// /// /// public static void SetVerticalOffset(DependencyObject obj, double value) { obj.SetValue(VerticalOffsetProperty, value); } /// /// Get value of HorizontalOffset property /// /// /// public static double GetHorizontalOffset(DependencyObject d) { if (d is ScrollViewer sv) { return sv.HorizontalOffset; } else if (d is ScrollContentPresenter scp) { return scp.HorizontalOffset; } return (double)d.GetValue(HorizontalOffsetProperty); } /// /// Set value of HorizontalOffset property /// /// /// public static void SetHorizontalOffset(DependencyObject obj, double value) { obj.SetValue(HorizontalOffsetProperty, value); } /// /// The DependencyProperty of VerticalOffset property /// public static readonly DependencyProperty VerticalOffsetProperty = DependencyProperty.RegisterAttached("VerticalOffset", typeof(double), typeof(ScrollViewerUtils), new PropertyMetadata(0.0, VerticalOffsetChangedCallback)); /// /// The DependencyProperty of HorizontalOffset property /// public static readonly DependencyProperty HorizontalOffsetProperty = DependencyProperty.RegisterAttached("HorizontalOffset", typeof(double), typeof(ScrollViewerUtils), new PropertyMetadata(0.0, HorizontalOffsetChangedCallback)); private static void VerticalOffsetChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue is not double offset) { return; } if (d is ScrollViewer sv) { sv.ScrollToVerticalOffset(offset); } else if (d is ScrollContentPresenter scp) { scp.SetVerticalOffset(offset); } } private static void HorizontalOffsetChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) { if (e.NewValue is not double offset) { return; } if (d is ScrollViewer sv) { sv.ScrollToHorizontalOffset(offset); } else if (d is ScrollContentPresenter scp) { scp.SetHorizontalOffset(offset); } } } }