Я столкнулся с точно такой же проблемой, за исключением того, что мой сценарий был немного сложнее.Вместо того, чтобы использовать DataGrid в ScrollViewer, у меня в ScrollViewer была группа UserControl (называемая ProductDataGrid и определенная ниже):
ProductDataGrid.xaml:
<UserControl x:Class="My.Control.ProductDataGrid" ...>
<Grid>
<Grid.RowDefinitions>...</Grid.RowDefinitions>
<TextBlock x:Name="Header" Grid.Row="0" ... />
<DataGrid x:Name="ProductData" Grid.Row="1" ... />
</Grid>
</UserControl>
ProductPortfolioListView.xaml:
<Page ...
xmlns:my="clr-namespace:My.Control"
....>
<Grid>
<Grid.RowDefinitions>...</Grid.RowDefinitions>
<ScrollViewer x:Name="ProductScrollViewer">
<StackPanel>
<my:ProductDataGrid ... />
<my:ProductDataGrid ... />
<my:ProductDataGrid ... />
</StackPanel>
</ScrollViewer>
Решение, предоставленное Livsi, исправно, но мой UserControl не имел доступа к моему ScrollViewer, поэтому вот мое решение:
ProductPortfolioListView.xaml:
<Page ...
xmlns:my="clr-namespace:My.Control"
....>
<Grid>
<Grid.RowDefinitions>...</Grid.RowDefinitions>
<ScrollViewer x:Name="ProductScrollViewer">
<StackPanel>
<my:ProductDataGrid ...
PreviewMouseWheel="ProductDataGrid_PreviewMouseWheel" />
<my:ProductDataGrid ...
PreviewMouseWheel="ProductDataGrid_PreviewMouseWheel" />
<my:ProductDataGrid ...
PreviewMouseWheel="ProductDataGrid_PreviewMouseWheel" />
</StackPanel>
</ScrollViewer>
ProductPortfolioListView.xaml.cs:
void ProductDataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs args)
{
ProductScrollViewer.ScrollToVerticalOffset(ProductScrollViewer.ContentVerticalOffset - args.Delta;
args.Handled = true;
}
Обратите внимание, что прелесть этого решения заключается в том, что я могу отделить свою DataGrid от Страницы, которая будет их хранить, поэтому я обеспечу изоляцию кода и меньшедублированный код.И что еще лучше, я абсолютно использую тот факт, что RoutedEvents продолжает распространяться от Источника ко всем его родителям, пока кто-то не обработает его (в моем случае это мой ProductScrollViewer).