2013-03-28 18 views
5

Tôi đang tạo một ứng dụng wpf có 2 thẻ dữ liệu và tôi muốn chúng cuộn lại với nhau. Tôi biết rằng lớp DataGridView có một sự kiện cuộn mà bạn có thể sử dụng để thực hiện các thay đổi cần thiết cho lưới khác, nhưng DataGrids không có sự kiện Cuộn. Tôi PHẢI sử dụng một DataGrid.Chia sẻ 1 thanh cuộn giữa hai DataGrids

Ví dụ này là tốt nhưng không phải là WPF và nó đang sử dụng DataGridView thay vì DataGrid. Using one scroll bar to control two DataGridView

Cách tốt nhất để có nó để thanh cuộn của lưới dữ liệu cũng sẽ di chuyển thanh cuộn của lưới dữ liệu trong WPF và DataGrids?

Trả lời

7

Bạn có thể thực hiện việc này bằng cách lấy Trình xem ảnh cơ bản của cả DataGrid và thiết lập sự kiện tương ứng. Dưới đây là một ví dụ nhanh mà tôi đã thực hiện dường như hoạt động như bạn đã mô tả.

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> 
    <Grid> 
     <DataGrid AutoGenerateColumns="True" Height="200" HorizontalAlignment="Left" Margin="52,69,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="200" ItemsSource="{Binding Collection}" /> 
     <DataGrid AutoGenerateColumns="True" Height="200" HorizontalAlignment="Left" Margin="270,69,0,0" Name="dataGrid2" VerticalAlignment="Top" Width="200" ItemsSource="{Binding Collection}" /> 
    </Grid> 
</Window> 

mã sau:

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 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     ObservableCollection<Person> _collection = new ObservableCollection<Person>(); 
     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<Person> 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; } 
    } 
} 

gì đang xảy ra là tôi đang lặp lại qua VisualTree của cả hai lưới dữ liệu sủ khi tải Window sử dụng getScrollbar. Sau đó tôi thiết lập sự kiện di chuyển đã thay đổi cho cả DataGrids và sau đó cuộn đến phần bù dọc được thay đổi bên trong trình xử lý sự kiện đã thay đổi cuộn.

+0

Cảm ơn bạn rất nhiều! Tôi đã tìm kiếm 2 ngày rồi! Tôi chưa thử nghiệm mã của bạn với tôi nhưng điều này có vẻ chính xác những gì tôi đang tìm kiếm! – Lainezor

+0

@Lainezor Xin vui lòng cho tôi biết nếu nó hoạt động. Nó làm việc cho tôi =] –

+0

Tôi có datagrids của tôi bên trong một usercontrol. Các usercontrol trong cửa sổ là trong một expander vì vậy tôi đang cố gắng tìm ra cách sử dụng nó với tôi. – Lainezor