0

Je suis à la recherche d'un moyen facile de faire un modèle de contrôle pour un ScrollBar DataGrid. La seule partie de ma grille de données nécessitant un modèle de contrôle est la barre de défilement horizontale, c'est-à-dire. PART_HorizontalScrollBar. Y at-il quelque chose comme ça que je pourrais ajouter à mes ressources de style peut-être?ControlTemplate pour DataGrid ScrollBar

<Setter Property="Template"> 
<Setter.Value > 
<ControlTemplate x:Name= "PART_HorizontalScrollBar" > 
<DockPanel> etc... ... 

Le problème est que lorsque j'ajoute ce controltemplate, les en-têtes de colonnes disparaissent. Si je supprime le controltemplate, les en-têtes de colonnes réapparaissent, mais pas la barre de défilement horizontale. Merci pour les suggestions.

Répondre

1

passer outre l'ensemble du modèle pour la DataGrid et définissez la propriété Template du PART_HorizontalScrollBar à votre modèle personnalisé:

<DataGrid ...> 
    <DataGrid.Resources> 
     <ControlTemplate x:Key="yourCustomTemplate" /> 
    </DataGrid.Resources> 
    <DataGrid.Template> 
     <ControlTemplate TargetType="{x:Type DataGrid}"> 
      <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="True"> 
       <ScrollViewer x:Name="DG_ScrollViewer" Focusable="false"> 
        <ScrollViewer.Template> 
         <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
          <Grid> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto"/> 
            <ColumnDefinition Width="*"/> 
            <ColumnDefinition Width="Auto"/> 
           </Grid.ColumnDefinitions> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="Auto"/> 
            <RowDefinition Height="*"/> 
            <RowDefinition Height="Auto"/> 
           </Grid.RowDefinitions> 
           <Button Command="{x:Static DataGrid.SelectAllCommand}" Focusable="false" Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/> 
           <DataGridColumnHeadersPresenter x:Name="PART_ColumnHeadersPresenter" Grid.Column="1" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/> 
           <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" CanContentScroll="{TemplateBinding CanContentScroll}" Grid.ColumnSpan="2" Grid.Row="1"/> 
           <ScrollBar x:Name="PART_VerticalScrollBar" Grid.Column="2" Maximum="{TemplateBinding ScrollableHeight}" Orientation="Vertical" Grid.Row="1" Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" ViewportSize="{TemplateBinding ViewportHeight}"/> 
           <Grid Grid.Column="1" Grid.Row="2"> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/> 
             <ColumnDefinition Width="*"/> 
            </Grid.ColumnDefinitions> 
            <ScrollBar x:Name="PART_HorizontalScrollBar" 
                 Grid.Column="1" 
                 Maximum="{TemplateBinding ScrollableWidth}" 
                 Orientation="Horizontal" 
                 Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" 
                 Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
                 ViewportSize="{TemplateBinding ViewportWidth}" 
                 Template="{StaticResource yourCustomTemplate}"/> 
           </Grid> 
          </Grid> 
         </ControlTemplate> 
        </ScrollViewer.Template> 
        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </ScrollViewer> 
      </Border> 
     </ControlTemplate> 
    </DataGrid.Template> 
</DataGrid> 

Malheureusement, vous ne pouvez pas remplacer seulement une partie d'un ControlTemplate:

WPF: Is there a way to override part of a ControlTemplate without redefining the whole style?

+0

Alors, où puis-je trouver le modèle DataGrid par défaut complet s'il vous plaît? – harpagornis

+0

Je l'ai posté dans ma réponse :) – mm8

+0

Je ne vois pas où ce lien SO discute un modèle de contrôle pour un DataGrid. Ce lien montre qu'il n'y a qu'un PART dans un DataGrid. https://docs.microsoft.com/en-us/dotnet/framework/wpf/controls/datagrid-styles-and-templates#datagrid-parts – harpagornis