Вы можете обмануть в DataGrid, чтобы выставить свою ScrollViewer в качестве государственной собственности для каждой сетки, когда для example innerGridControl_ScrollChanged() обработчик, вызываемый во время инициализации usercontrol. Чтобы открыть его, вы можете сделать свою сетку в файле xaml View, а затем составить два из них в другом представлении xaml. Ниже код на innerGrid.xaml.cs, например:
public ScrollViewer Scroller { get; set; } // exposed ScrollViewer from the grid
private bool _isFirstTimeLoaded = true;
private void innerGridControl_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (_isFirstTimeLoaded) // just to save the code from casting and assignment after 1st time loaded
{
var scroller = (e.OriginalSource) as ScrollViewer;
Scroller = scroller;
_isFirstTimeLoaded = false;
}
}
на OuterGridView.xaml поместить вложенное определение обработчика событий:
<Views:innerGridView Grid.Row="1" Margin="2,0,2,2" DataContext="{Binding someCollection}"
x:Name="grid1Control"
ScrollViewer.ScrollChanged="Grid1Attached_ScrollChanged"
></Views:innerGridView>
<Views:innerGridView Grid.Row="3" Margin="2,0,2,2" DataContext="{Binding someCollection}"
x:Name="grid2Control"
ScrollViewer.ScrollChanged="Grid2Attached_ScrollChanged"
></Views:innerGridView>
затем получить доступ, что общественное ScrollViewer.SetHorizontalOffset (e.HorizontalOffset), когда происходит другое событие прокрутки. Ниже код в OuterGridView.xaml.cs на одном из определения обработчика (
private void Grid1Attached_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (e != null && !e.Handled)
{
if (e.HorizontalChange != 0.0)
{
grid2Control.Scroller.ScrollToHorizontalOffset(e.HorizontalOffset);
}
e.Handled = true;
}
}
private void Grid2Attached_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
if (e != null && !e.Handled)
{
if (e.HorizontalChange != 0.0)
{
grid1Control.Scroller.ScrollToHorizontalOffset(e.HorizontalOffset);
}
e.Handled = true;
}
}
Также убедитесь, что любое другое событие scroll_changed внутри внутренней сетки (если таковые имеются, например, если вы определяете TextBox с скроллер по умолчанию в одном из шаблонов данных столбца) имеет свой набор e.Handled в true, чтобы предотвратить обработку обработчиком внешней сетки (это произошло из-за поведения барботирования по умолчанию для маршрутизируемых событий). В качестве альтернативы вы можете добавить дополнительные данные, если проверка на e.OriginalSource или e.Source чтобы отфильтровать событие прокрутки, которое вы планируете обработать.
Да. Тем не менее, я сделал то же самое в прошлом. Похоже, нам не нужно было взламывать визуальное дерево таким образом. Еще один способ, по которому WPF грубо по краям. – PeterAllenWebb 2009-05-13 14:32:08