#問題
DataGridの外側にScrollViewerを配置した場合、DataGrid上でマウスホイールを動かしても外側のScrollViewerが機能しない。
#原因
DataGrid 自身が持つ ScrollViewer がマウスホイール操作を奪うため。
#対策
DataGrid上でのマウスホイールイベントが発生した際に、親のScrollViewerを探してスクロールさせる。
##実装
XAML側実装
DataGridにPreviewMouseWheelイベントを設定
<DataGrid
ScrollViewer.VerticalScrollBarVisibility="Disabled"
PreviewMouseWheel="DataGrid_PreviewMouseWheel">
コードビハインド側実装
XAML側のPreviewMouseWheelイベントを処理するイベント実装
private void DataGrid_PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
UIElement element = sender as UIElement;
while (element != null)
{
element = VisualTreeHelper.GetParent(element) as UIElement;
if (element is ScrollViewer scrollViewer)
{
//scrollViewerでスクロールする
scrollViewer.ScrollToVerticalOffset(scrollViewer.VerticalOffset - (e.Delta / 3));
e.Handled = true;
return;
}
}
}
#参考
(XAML#20)「DataGrid と ScrollViewer」
https://blogs.itmedia.co.jp/mohno/2013/12/xaml20datagrid--92ef.html