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="&lt;"
  Interval="1000" Delay="1000"
  Command="{x:Static ScrollBar.LineLeftCommand}"
  CommandTarget="{Binding ElementName=dgscrollviewer}"ClickMode="Hover" />

  <RepeatButton x:Name="LineRightButton" Width="90" Content="&gt;"
  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? Спасибо.

0 ответов

Другие вопросы по тегам