[英]Move rows between two sortable DataGrids that use DataTables as sorces
[英]Sharing 1 scrollbar between two DataGrids
我正在制作一個有2個數據網格的wpf應用程序,我想讓它們一起滾動。 我知道DataGridView類有一個滾動事件,您可以使用它對其他網格進行必要的更改,但DataGrids沒有Scroll事件。 我必須使用DataGrid。
這個例子很好,但不是WPF,而是使用DataGridView而不是DataGrid。 使用一個滾動條來控制兩個DataGridView
擁有它的最佳方法是什么,以便一個數據網格的滾動條也將在WPF和DataGrids中移動數據網格的滾動條?
您可以通過獲取DataGrid的基礎ScrollViewer並相應地設置事件來完成此操作。 下面是我所做的一個快速示例,它似乎按照您的描述工作。
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>
代碼背后:
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; }
}
}
發生的事情是我使用getScrollbar在Window加載時迭代兩個DataGrids的VisualTree。 然后,我為兩個DataGrids設置了滾動更改事件,然后滾動到剛剛在滾動更改事件處理程序中更改的垂直偏移。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.