Je veux créer un style global qui définit la VerticalAlignment
sur Center
pour tous les contrôles TextBlock
à l'intérieur d'une DataGrid
ou d'une DataGridTextColumn
.
Je ne veux pas copier ce qui suit dans chaque DataGridTextColumn
car cela me semble répétitif.
<DataGridTextColumn Header="Some Property" Binding="{Binding SomeProperty}">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"></Setter>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
J'ai essayé quelque chose comme ce qui suit, mais cela ne fonctionne pas car DataGridTextColumn
n'hérite pas de FrameworkElement
ou FrameworkContentElement
. DataGrid
lui-même le fait, mais tout emballage supplémentaire que j'essaie conduit à des erreurs:
<Style TargetType="DataGridTextColumn">
<Setter Property="ElementStyle">
<Setter.Value>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
</Setter.Value>
</Setter>
</Style>
Vous pouvez définir une CellStyle
comme ci-dessous:
<Style x:Key="DataGridCellStyle" TargetType="DataGridCell">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Et affectez-le à la grille de données: CellStyle="{StaticResource DataGridCellStyle}"
. De cette manière, le contenu de toutes vos cellules sera centré.
EDIT: Le code ci-dessus provient d'un de mes projets et contient également le code permettant de supprimer les lignes de grille dans le DataGrid. Vous pouvez les récupérer en remplaçant Grid
par Border
dans le modèle. Comme ça:
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
Créer un style en tant que ressource statique
<UserControl.Resources>
<Style x:Key="verticalCenter" TargetType="{x:Type TextBlock}">
<Setter Property="VerticalAlignment" Value="Center" />
</Style>
</UserControl.Resources>
Ensuite, vous pouvez l'affecter au ElementStyle du DataGridTextColumn
<DataGridTextColumn ElementStyle="{StaticResource verticalCenter}" />
Il suffit d'utiliser la DataGridTemplateColumn
:
<DataGridTemplateColumn Width="SizeToCells">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock HorizontalAlignment="Center" Width="100" Height="20"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>