wpf 两个DataGrid的滚动条实现同步滚动

本文详细介绍了在WPF中如何实现两个DataGrid的滚动条同步滚动。方法一是利用DependencyProperty注册附加属性,通过监听HorizontalOffset属性变化来同步滚动;方法二是直接订阅ScrollChanged事件,当一个滚动条位置改变时,更新另一个滚动条的位置。这两种方法为实现UI元素间的滚动同步提供了实用方案。
摘要由CSDN通过智能技术生成

转载 https://www.cnblogs.com/lylgt/p/10362158.html
参考 https://www.cnblogs.com/chuncn/archive/2011/10/08/2202175.html
实现方法:

方法一:利用DependencyProperty类的RegisterAttached方法,在属性系统上注册附加属性,并将滚动条属性值HorizontalOffset通过注册属性关联到一个方法。

ScrollViewer sv1, sv2;

private void Window_Loaded(object sender, RoutedEventArgs e)
{
//分别获取两个DataGrid的ScrollViewer
sv1 = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.DataGrid1, 0), 0) as ScrollViewer;
sv2 = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.DataGrid2, 0), 0) as ScrollViewer;

//将滚动条属性值HorizontalOffset关联到OnScrollChanged1方法

var offsetChangeListener = DependencyProperty.RegisterAttached(“ListenerOffset1”, typeof(object), typeof(UserControl), new PropertyMetadata(OnScrollChanged1));
var binding = new Binding(“HorizontalOffset”) { Source = sv1 };
sv1.SetBinding(offsetChangeListener, binding);

offsetChangeListener = DependencyProperty.RegisterAttached("ListenerOffset2", typeof(object), typeof(UserControl), new PropertyMetadata(OnScrollChanged2));
binding = new Binding("HorizontalOffset") { Source = sv2 };
sv2.SetBinding(offsetChangeListener, binding);

}

public void OnScrollChanged1(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
double a = (double)e.NewValue; //获取滚动条位置变化后的属性值
sv2.ScrollToHorizontalOffset(a);
}

public void OnScrollChanged2(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
double a = (double)e.NewValue;
sv1.ScrollToHorizontalOffset(a);
}

方法二:利用滚动条的ScrollChanged事件,同步两个滚动条的位置。

ScrollViewer sv1, sv2;
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//分别获取两个DataGrid的ScrollViewer
sv1 = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.DataGrid1, 0), 0) as ScrollViewer;
sv2 = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.DataGrid2, 0), 0) as ScrollViewer;

//关联ScrollChanged事件
sv1.ScrollChanged += new ScrollChangedEventHandler(sv1_ScrollChanged);
sv2.ScrollChanged += new ScrollChangedEventHandler(sv2_ScrollChanged);

}

void sv1_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
sv2.ScrollToHorizontalOffset(sv1.HorizontalOffset);
}

void sv2_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
sv1.ScrollToHorizontalOffset(sv2.HorizontalOffset);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值