zoukankan      html  css  js  c++  java
  • WPF学习笔记(5):两个DataGrid的滚动条实现同步滚动

    效果:两个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, 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);
    }
  • 相关阅读:
    JVM系列【2】Class文件结构
    JVM系列【5】JVM常用指令
    JVM系列【4】内存模型
    JVM系列【3】Class文件加载过程
    新编html网页设计从入门到精通 (龙马工作室) pdf扫描版​
    HTML5移动开发即学即用(双色) 王志刚 pdf扫描版​
    HTML5和CSS3实例教程 中文版 高清PDF扫描版
    HTML5+CSS3网站设计教程 (张晓景,胡克) [iso]
    HTML5+CSS3+jQuery Mobile轻松构造APP与移动网站 (陈婉凌) 中文pdf扫描版
    HTML5 Canvas游戏开发实战 PDF扫描版
  • 原文地址:https://www.cnblogs.com/lylgt/p/10362158.html
Copyright © 2011-2022 走看看