2013-03-28 7 views
5

Robię aplikacji wpf, która ma 2 datagrids i chcę, aby przewijać razem. Wiem, że klasa DataGridView ma zdarzenie przewijania, które można użyć wprowadzić niezbędne zmiany w drugiej siatce, ale DataGrids nie mają zdarzenia przewijania. Muszę używać DataGrid.Udostępnianie 1 paska przewijania między dwoma DataGrids

Ten przykład jest dobry, ale nie ma WPF i używa DataGridView zamiast DataGrid. Using one scroll bar to control two DataGridView

Jaki jest najlepszy sposób na to, aby pasek przewijania jednej siatki danych przesuwał również pasek przewijania siatki danych w WPF i DataGrids?

Odpowiedz

7

Możesz to zrobić, pobierając podstawowy ScrollViewer z obu DataGrid i odpowiednio ustawiając wydarzenie. Poniżej znajduje się szybki przykład, który wydaje się działać tak, jak opisałeś.

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> 

kod za:

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; } 
    } 
} 

Co się dzieje jest to, że mam iteracja w VisualTree obu datagrids na obciążenia okno używając getScrollbar. Następnie skonfigurowałem zdarzenie zmienione przez przewijanie dla obu DataGrids, a następnie przewiń do pionowego przesunięcia, które zostało właśnie zmienione wewnątrz programu obsługi zdarzeń zmienionego przez przewijanie.

+0

Dziękuję bardzo! Szukałem już 2 dni! Nie testowałem jeszcze mojego kodu, ale wygląda na to, że dokładnie to, czego szukam! – Lainezor

+0

@Lainezor Proszę dać mi znać, jeśli to działa. To zadziałało dla mnie =] –

+0

Mam moje datagridy wewnątrz kontroli użytkownika. Sterowanie użytkownika w oknie jest ekspanderem, więc próbuję dowiedzieć się, jak go używać z moim. – Lainezor

Powiązane problemy