web-dev-qa-db-fra.com

Créer un style pour TextBlock dans DataGridTextColumn

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>
12
timmkrause

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>
11
Gildor

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}" />
17
Michael Spranger

Il suffit d'utiliser la DataGridTemplateColumn:

<DataGridTemplateColumn Width="SizeToCells">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock HorizontalAlignment="Center" Width="100" Height="20"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
1
Dwsgg