效果:两个DataGrid的滚动条实现同步滚动。

代码参考了博客园chuncn的文章《.net中同步多个ScrollViewer滚动的四种方法》,原文是针对ListBox的。现改为针对DataGrid,略微作了修改,代码以水平滚动条为例。

原文地址: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, ), ) as ScrollViewer;
sv2 = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.DataGrid2, ), ) 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, ), ) as ScrollViewer;
sv2 = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.DataGrid2, ), ) 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);
}

WPF学习笔记(5):两个DataGrid的滚动条实现同步滚动的更多相关文章

  1. WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决

    原文:WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决 如下图,在凭证编辑窗体中,有的单元格不需要数字,但如果录入数字后再删除,会触发数字验证,单元格显示红色框线,导致不能执行 ...

  2. WPF学习笔记-用Expression Design制作矢量图然后导出为XAML

    WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...

  3. WPF 学习笔记-设置属性使窗口不可改变大小

    原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...

  4. WPF 学习笔记-在WPF下创建托盘图标

    原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...

  5. VS编程,WPF中两个滚动条 ScrollViewer 同步滚动的一种方法

    原文:VS编程,WPF中两个滚动条 ScrollViewer 同步滚动的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/ar ...

  6. Hadoop学习笔记(两)设置单节点集群

    本文描写叙述怎样设置一个单一节点的 Hadoop 安装.以便您能够高速运行简单的操作,使用 Hadoop MapReduce 和 Hadoop 分布式文件系统 (HDFS). 參考官方文档:Hadoo ...

  7. 【web开发学习笔记】Structs2 Action学习笔记(两)

    action学习笔记2-大约action method讨论 Action运行的时候并不一定要运行execute方法,能够在配置文件里配置Action的时候用method=来指定运行哪个方法 也能够在u ...

  8. 【WPF学习笔记】之如何把数据库里的值读取出来然后显示在页面上:动画系列之(六)(评论处有学习资料及源码)

    (应博友们的需要,在文章评论处有源码链接地址,以及WPF学习资料.工具等,希望对大家有所帮助) ...... 承接系列五 上一节讲了,已经把数据保存到数据库并且删除数据,本讲是把已经存在的数据从数据库 ...

  9. Android开源项目SlidingMenu本学习笔记(两)

    我们已经出台SlidingMenu使用:Android开源项目SlidingMenu本学习笔记(一个),接下来再深入学习下.依据滑出项的Menu切换到相应的页面 文件夹结构: watermark/2/ ...

随机推荐

  1. spring colud 博客

    https://blog.csdn.net/forezp/article/details/70148833

  2. mongoDB(Window)

    1.启动命令 mongod --dbpath F:\mongo\data             注:dbpath路径不能有空格,我开始用F:\Program Files,就因为有一个空格,失败了. ...

  3. git舍弃文件更改

    未进行任何提交,即文件更改在工作区 # filename 对应进行操作的文件名 git checkout -- filename 已用git add 命令提交,即文件更改在暂存区 # 舍弃暂存区的修改 ...

  4. 使用yarn 安装 Vue-DevTools

    1. 从 github 下载 vuejs/vue-devtools https://github.com/vuejs/vue-devtools/archive/dev.zip 2.安装yarn 及 编 ...

  5. WordCount改进 小组项目

    GitHub地址:https://github.com/DM-Star/WordCount-opt 作业需求:http://www.cnblogs.com/ningjing-zhiyuan/p/865 ...

  6. NOIP训练测试2(2017081502)

    唔,这是今天第二场训练测试. 上一轮不够难,现在来一波更简单的.[滑稽] 注意时间! 测试时间:3小时 题目一:Cantor表 题目二:回文数 题目三:拼数 题目四:进制位 题目五:邮票面值设计 都是 ...

  7. 【技术课堂】如何管理MongoDB数据库?

  8. unity3DGI

    Realtime GI,实时全局光照, 1.构成 : 可实时更新的lightmap + 可实时更新的光照探头(light probe)+ 可实时更新的cubemap(Reflection probe) ...

  9. mysql的一些配置优化

    [mysqld]lower_case_table_names=1datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Di ...

  10. 2019.01.02 NOIP训练 三七二十一(生成函数)

    传送门 生成函数基础题. 题意简述:求由1,3,5,7,9这5个数字组成的n位数个数,要求其中3和7出现的次数都要是偶数. 考虑对于每个数字构造生成函数. 对于1,5,9:∑nxnn!=ex\sum_ ...