web-dev-qa-db-fra.com

Définir un remplissage sur dataGridCells dans WPF

question simple: Comment puis-je définir un remplissage sur un dataGridCell dans WPF? (soit une à la fois, soit sur toutes les cellules, je m'en fiche)

J'ai essayé d'utiliser le DataGrid.CellStyle propriété en ajoutant un setter sur la DataGridCell.Padding ainsi que l'utilisation de la propriété DataGridColumn.CellStyle propriété de la même manière sans effet.

J'ai également essayé d'utiliser le DataGridColumn.ElementStyle propriété sans plus de chance.

Je suis un peu coincé là-bas, quelqu'un a-t-il réussi à appliquer un remplissage sur un dataGridCell?

NB: J'ajouterai que non, je ne peux pas utiliser de bordures transparentes pour cela, car j'utilise déjà les propriétés de bordures pour autre chose. Je ne peux pas non plus utiliser la propriété margin (qui semble fonctionner, de façon assez surprenante) car j'utilise la propriété background et je ne veux pas d'espace "vide" entre mes cellules.

56
David

Le problème est que le Padding n'est pas transféré vers le Border qui se trouve dans le modèle pour DataGridCell. Vous pouvez modifier le modèle et ajouter le TemplateBinding pour Padding

<DataGrid ...>
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="Padding" Value="20"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <Border Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                            <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </DataGrid.CellStyle>
    <!--...-->
</DataGrid>
113
Fredrik Hedblad

Voici une méthode plus propre (mon avis) qui combine l'approche de David

<Resources>
    <Style x:Key="ColumnElementStyle" TargetType="TextBlock">
        <Setter Property="Margin" Value="5,0,10,0" />
    </Style>
</Resources>

ensuite...

<DataGridTextColumn ElementStyle="{StaticResource ColumnElementStyle}" />
<DataGridTextColumn ElementStyle="{StaticResource ColumnElementStyle}" />

(dans mon cas, mes lignes sont en lecture seule, donc pas EditingStyle)

19
Scott Brickey

Presque 5 ans plus tard, puisque cette question semble toujours utile (elle reçoit toujours des votes positifs) et qu'elle a été demandée, voici la solution que j'ai utilisée (avec l'ElementStyle) sur une TextColumn (mais vous pouvez faire de même pour tout type de DataGridColumn):

J'ai tout fait en code derrière:

class MyTextColumn : DataGridTextColumn
{
    public MyTextColumn()
    {
        ElementStyle = new Style(typeof(TextBlock));
        EditingElementStyle = new Style(typeof(TextBox));

        ElementStyle.Setters.Add(new Setter(FrameworkElement.MarginProperty, new Thickness(3)));
        EditingElementStyle.Setters.Add(new Setter(Control.PaddingProperty, new Thickness(0, 1, 0, 1)));
    }
}

Mais si vous voulez le faire directement en xaml:

<DataGrid.Columns>
    <DataGridTextColumn>
        <DataGridTextColumn.ElementStyle>
            <Style TargetType="TextBlock">
                <Setter Property="Margin" Value="3"/>
            </Style>
        </DataGridTextColumn.ElementStyle>
        <DataGridTextColumn.EditingElementStyle>
            <Style TargetType="TextBox">
                <Setter Property="Padding" Value="0 1 0 1"/>
            </Style>
        </DataGridTextColumn.EditingElementStyle>
    </DataGridTextColumn>
</DataGrid.Columns>
8
David
<DataGrid.Columns>
      <DataGridTextColumn  MinWidth="100" Header="Changed by"  Width=""  Binding="{Binding Changedby}" IsReadOnly="True"  >
        <DataGridTextColumn.CellStyle>
          <Style TargetType="DataGridCell">
          <Setter Property="BorderThickness" Value="0"/>
          <Setter Property="Background" Value="Transparent" />
         <Setter Property="FrameworkElement.HorizontalAlignment"Value="Center"/>
          </Style>
      </DataGridTextColumn.CellStyle>
    </DataGridTextColumn>
1
Raj

Vous pouvez également essayer de changer

{Binding BindingValue, StringFormat={}{0:#0.0000}}

à

{Binding BindingValue, StringFormat={}{0:#0.0000 }}

Fait intéressant, le XAML {0: # 0.0000} de WPF honorera ce caractère d'espace supplémentaire au format du contrôle rendu pour déplacer vos valeurs hors du bord de vos colonnes de grille.

0
Jacob