Establecer un relleno en dataGridCells en WPF


Pregunta sencilla: ¿Cómo puedo configurar un relleno en una DataGridCell en WPF? (ya sea una a la vez o en todas las células, no me importa)

He intentado usar la propiedad DataGrid.CellStyle añadiendo un setter en la propiedad DataGridCell.Padding así como usando la propiedad DataGridColumn.CellStyle de la misma manera sin ningún efecto.

También intenté usar la propiedad DataGridColumn.ElementStyle sin más suerte.

Estoy un poco atascado allí, ¿alguien ha logrado aplicar un relleno en una célula de datos?

NB: Voy a añadir que no, no puedo use bordes transparentes para hacer esto, ya que ya uso las propiedades de borde para otra cosa. Tampoco puedo usar la propiedad margin (que parece funcionar, sorprendentemente) ya que uso la propiedad background y no quiero ningún espacio "en blanco" entre mis celdas.

Author: mattruma, 2011-03-09

5 answers

El problema es que el Padding no se transfiere al Border que está en la Plantilla para DataGridCell. Puede editar la Plantilla y agregar el TemplateBinding para 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>
 99
Author: Fredrik Hedblad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-09 14:18:59

Aquí hay un método más limpio (mi opinión) que combina el enfoque de David

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

Entonces...

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

(en mi caso, mis filas son solo de lectura, por lo que no hay estilo de edición)

 11
Author: Scott Brickey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-11 15:35:42

Casi 5 años después, ya que esta pregunta parece seguir siendo útil (todavía está recibiendo votos positivos) y ya que se ha solicitado, aquí está la solución que usé (con el ElementStyle) en un TextColumn (pero puede hacer lo mismo para cualquier tipo de DataGridColumn):

Lo hice todo en código detrás:

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)));
    }
}

Pero si quieres hacerlo directamente 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
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-26 11:12:15
<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
Author: Raj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-13 04:47:09

También puedes intentar cambiar

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

A

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

Curiosamente, el XAML {0:#0.0000 } de WPF honrará este carácter de espacio adicional en el formato del control renderizado para mover sus valores fuera del borde de sus columnas de cuadrícula.

 0
Author: Jacob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-21 18:03:41