在两个DataGrids之间共享1个滚动条

我正在制作一个有2个数据网格的wpf应用程序,我想让它们一起滚动。 我知道DataGridView类有一个滚动事件,您可以使用它对其他网格进行必要的更改,但DataGrids没有Scroll事件。 我必须使用DataGrid。

这个例子很好,但不是WPF,而是使用DataGridView而不是DataGrid。 使用一个滚动条来控制两个DataGridView

拥有它的最佳方法是什么,以便一个数据网格的滚动条也将移动WPF和DataGrids中的数据网格滚动条?

您可以通过获取DataGrid的基础ScrollViewer并相应地设置事件来完成此操作。 下面是我所做的一个快速示例,它似乎可以像您所描述的那样工作。

XAML:

      

代码背后:

 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes; using System.Collections.ObjectModel; namespace WpfApplication1 { ///  /// Interaction logic for MainWindow.xaml ///  public partial class MainWindow : Window { ObservableCollection _collection = new ObservableCollection(); ScrollViewer scrollView = null; ScrollViewer scrollView2 = null; public MainWindow() { for (int i = 0; i < 50; i++) { var p = new Person() { Name = string.Format("{0}", i), Age = i }; _collection.Add(p); } this.DataContext = this; InitializeComponent(); } void scrollView_ScrollChanged(object sender, ScrollChangedEventArgs e) { var newOffset = e.VerticalOffset; if ((null != scrollView) && (null != scrollView2)) { scrollView.ScrollToVerticalOffset(newOffset); scrollView2.ScrollToVerticalOffset(newOffset); } } public ObservableCollection Collection { get { return _collection; } } private ScrollViewer getScrollbar(DependencyObject dep) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dep); i++) { var child = VisualTreeHelper.GetChild(dep, i); if ((null != child) && child is ScrollViewer) { return (ScrollViewer)child; } else { ScrollViewer sub = getScrollbar(child); if (sub != null) { return sub; } } } return null; } private void Window_Loaded(object sender, RoutedEventArgs e) { scrollView = getScrollbar(dataGrid1); scrollView2 = getScrollbar(dataGrid2); if (null != scrollView) { scrollView.ScrollChanged += new ScrollChangedEventHandler(scrollView_ScrollChanged); } if (null != scrollView2) { scrollView2.ScrollChanged += new ScrollChangedEventHandler(scrollView_ScrollChanged); } } } public class Person { public string Name { get; set; } public int Age { get; set; } } } 

发生的事情是我使用getScrollbar在Window加载时迭代两个DataGrids的VisualTree。 然后我为两个DataGrids设置了滚动更改事件,然后滚动到刚刚在滚动更改事件处理程序中更改的垂直偏移。