Я бы использовал два ScrollViewer, а не один
Вот макет элемента управления, который я бы использовал
<DockPanel>
<ScrollViewer x:Name="HeaderScrollViewer" DockPanel.Dock="Top">
<Grid x:Name="Headers" />
</ScrollViewer>
<ScrollViewer x:Name="ContentScrollViewer">
<Grid x:Name="Content" />
</ScrollViewer>
</DockPanel>
Есть несколько вещей, которые нужно отметить, чтобы эта работа работала правильно.
Скрыть полосы прокрутки на HeaderScrollViewer
.ScrollViewer предназначен только для функциональности - пользователь фактически не будет с ним взаимодействовать.
Когда ContentScrollViewer
прокручивается горизонтально, вручную прокрутите HeaderScrollViewer
на такое же расстояние.
Используйте Grid.IsSharedSizeScope и Grid.SharedSizeGroup , чтобы выровнять столбцы сетки заголовка с вашим содержимым.*