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