WPF DataGrid ColumnHeaders прокручивается синхронно с ячейками данных
ColumnHeaders моего WPF DataGrid не синхронизируется с ячейками данных при горизонтальной прокрутке. Похоже, что заголовки столбцов прокручиваются быстрее, чем ячейки данных. Вертикальная прокрутка работает нормально. Это представление, которое определяет ширину DataGrid в соответствии с размером окна:
<Window.DataContext>
<vm:DemoDgViewModel/>
</Window.DataContext>
<Grid x:Name="dGrid" Height="300" Margin="15,0,15,0" Background="AliceBlue" Width="1000">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="32"/>
<RowDefinition Height="32"/>
<RowDefinition Height="32"/>
<RowDefinition Height="32"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<DataGrid x:Name="demoDG" Width="{Binding Path=Width,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
ItemsSource="{Binding Path = DataContext.AppDataLcv,
RelativeSource={RelativeSource FindAncestor, AncestorType=
{x:Type Window}}}" Style ="{DynamicResource StDataGrid2}"
Grid.Row="0" Grid.RowSpan="6" Height="300" AlternationCount ="2"
IsSynchronizedWithCurrentItem="True" SelectionMode ="Single"
AutoGenerateColumns="False" CanUserAddRows="True" CanUserSortColumns ="True"
ScrollViewer.CanContentScroll="True" ColumnWidth="Auto">
<DataGrid.Columns>
<DataGridTextColumn Header="desciption" SortMemberPath="desc"
Binding ="{Binding Path=desc}" IsReadOnly="False" CanUserSort="True"
Width ="200">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Padding" Value="5,0,0,0"/>
</Style>
</DataGridTextColumn.ElementStyle>
<DataGridTextColumn.EditingElementStyle>
<Style TargetType="TextBox">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Padding" Value="5,0,0,0"/>
</Style>
</DataGridTextColumn.EditingElementStyle>
</DataGridTextColumn>
<!-- column 2, 3, 4, 5 same as the first -->
</DataGrid.Columns>
</DataGrid>
</Grid>
И это стиль DataGrid:
<!-- DataGrid Styles ============ -->
<Style x:Key="StDataGrid2" TargetType="DataGrid" >
<Setter Property="RowHeaderWidth" Value="0" />
<Setter Property="RowHeight" Value="32" />
<Setter Property="RowBackground" Value="PowderBlue" />
<Setter Property="FontWeight" Value="Regular" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="VerticalAlignment" Value="Stretch" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="ScrollViewer.CanContentScroll" Value="True" />
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Hidden"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ColumnHeaderStyle" Value ="{DynamicResource stDghdr}" />
<Setter Property="Margin" Value="0,0,10,0" />
<Setter Property="Template">
<Setter.Value >
<ControlTemplate >
<Border BorderThickness="1" BorderBrush="#FF60727B">
<DockPanel Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource
FindAncestor, AncestorType={x:Type Window}}}">
<StackPanel DockPanel.Dock="Top" Height="15" Orientation="Horizontal"
HorizontalAlignment="Left" CanHorizontallyScroll="False" Width="200" >
<RepeatButton x:Name="LineLeftButton" Width="90" Content="<"
Interval="1000" Delay="1000"
Command="{x:Static ScrollBar.LineLeftCommand}"
CommandTarget="{Binding ElementName=dgscrollviewer}"ClickMode="Hover" />
<RepeatButton x:Name="LineRightButton" Width="90" Content=">"
Interval="1000" Delay="1000"
Command="{x:Static ScrollBar.LineRightCommand}"
CommandTarget="{Binding ElementName=dgscrollviewer}" ClickMode="Hover"/>
</StackPanel>
<ScrollViewer x:Name="dgscrollviewer" CanContentScroll ="True"
VerticalScrollBarVisibility="Hidden" HorizontalScrollBarVisibility ="Auto">
<StackPanel Orientation="Vertical" Height="Auto"
HorizontalAlignment="Stretch" CanHorizontallyScroll="True">
<DataGridColumnHeadersPresenter HorizontalAlignment="Stretch"
Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource
FindAncestor, AncestorType={x:Type Window}}}"
HorizontalContentAlignment="Stretch" Height= "32" Padding="0" Margin="0" />
<ItemsPresenter Height="300" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"/>
</StackPanel>
</ScrollViewer>
</DockPanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="stDghdr" TargetType="DataGridColumnHeader" >
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Stretch" />
<Setter Property="HorizontalContentAlignment" Value ="Stretch"/>
<Setter Property="Height" Value="25" />
<Setter Property="SeparatorBrush" Value="#79858b" />
<Setter Property="Padding" Value="5,0,5,0" />
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="FontSize" Value="12" />
<Setter Property="Background" Value ="LavenderBlush"/>
<Setter Property="BorderBrush" Value="#FF60727B"/>
<Setter Property="BorderThickness" Value="2,0,2,2"/>
</Style>
Вот ссылка для скачивания демоверсии: Демо
* Редактирование / обновление: я думаю, что ColumnHeaders прокручивается быстрее, потому что они управляются другим ScrollViewer? Например, если я установил большое свойство FontSize в ScrollViewer в стиле DataGrid, текст в ячейках DataGrid станет больше, но не текст в ColumnHeaders.
Любые идеи или предложения помимо создания ControlTemplate для всей DataGrid? Спасибо.