namespace NeoUI.Assists;
///
/// ScrollViewerAssist 类提供附加属性,用于同步多个 ScrollViewer 控件的滚动位置。通过设置 SynchronizedScroll 附加属性,可以使得一个 ScrollViewer 的滚动变化时,其他关联的 ScrollViewer 也会自动进行相应的滚动。
///
///
/// 该类主要用于在 WPF 应用程序中实现多 ScrollViewer 之间的滚动同步功能,特别适用于需要同时滚动显示不同内容但保持视觉一致性的场景。
///
public class ScrollViewerAssist
{
///
/// 获取指定依赖对象的SynchronizedScroll属性值。
///
/// 要获取SynchronizedScroll属性值的依赖对象。
/// 返回与指定依赖对象关联的ScrollViewer。如果未设置,则返回null。
public static ScrollViewer GetSynchronizedScroll(DependencyObject obj)
{
return (ScrollViewer)obj.GetValue(SynchronizedScrollProperty);
}
///
/// 设置指定依赖对象的SynchronizedScroll属性值。
///
/// 要设置SynchronizedScroll属性的依赖对象。
/// 要设置的ScrollViewer值,用于同步滚动位置。
public static void SetSynchronizedScroll(DependencyObject obj, ScrollViewer value)
{
obj.SetValue(SynchronizedScrollProperty, value);
}
///
/// SynchronizedScrollProperty 是一个依赖属性,用于在多个 ScrollViewer 控件之间同步滚动位置。通过此属性,可以设置或获取与特定依赖对象关联的 ScrollViewer 实例,从而实现当一个 ScrollViewer 的滚动位置发生变化时,其他关联的 ScrollViewer 也能自动调整其滚动位置以保持一致。
///
public static readonly DependencyProperty SynchronizedScrollProperty =
DependencyProperty.RegisterAttached("SynchronizedScroll",
typeof(ScrollViewer), typeof(ScrollViewerAssist),
new PropertyMetadata(null, OnSynchronizedScrollChanged));
private static void OnSynchronizedScrollChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (d is not ScrollViewer scroll)
{
return;
}
//从无到有
if (e.OldValue == null && e.NewValue != null)
{
scroll.ScrollChanged += SynchronizeScrollViewer;
}
}
private static void SynchronizeScrollViewer(object sender, ScrollChangedEventArgs e)
{
var senderScroll = sender as ScrollViewer;
if (senderScroll == null)
{
return;
}
//获取要被驱动的ScrollViewer
var targetScroll = GetSynchronizedScroll(senderScroll);
targetScroll.ScrollToHorizontalOffset(senderScroll.HorizontalOffset);
}
}