Ustaw padding na dataGridCells w WPF

Proste pytanie: Jak mogę ustawić padding na dataGridCell w WPF? (albo pojedynczo albo na wszystkich komórkach, nie obchodzi mnie to)

Próbowałem użyć właściwości DataGrid.CellStyle, dodając setter do Właściwości DataGridCell.Padding oraz używając właściwości DataGridColumn.CellStyle w ten sam sposób bez żadnego efektu.

Próbowałem również korzystać z nieruchomości DataGridColumn.ElementStyle bez większego szczęścia.

Utknąłem tam, czy komuś udało się nałożyć wyściółkę na dataGridCell?

NB: dodam, że nie, nie mogę użyj przezroczystych obramowań, aby to zrobić, ponieważ ja już używam właściwości obramowania dla czegoś innego. Nie mogę również użyć właściwości margin (która wydaje się działać, co zaskakujące), ponieważ używam właściwości tła i nie chcę żadnej "pustej" przestrzeni między moimi komórkami.

Author: mattruma, 2011-03-09

5 answers

Problem polega na tym, że Padding nie jest przenoszona do Border, który jest w szablonie dla DataGridCell. Możesz edytować szablon i dodać TemplateBinding dla 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-09 14:18:59

Oto metoda czyszczenia (moim zdaniem), która łączy podejście z David

<Resources>
    <Style x:Key="ColumnElementStyle" TargetType="TextBlock">
        <Setter Property="Margin" Value="5,0,10,0" />
    </Style>
</Resources>
Więc...
<DataGridTextColumn ElementStyle="{StaticResource ColumnElementStyle}" />
<DataGridTextColumn ElementStyle="{StaticResource ColumnElementStyle}" />

(w moim przypadku wiersze są tylko do odczytu, więc bez edycji)

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 15:35:42

Prawie 5 lat później, ponieważ to pytanie wydaje się być nadal przydatne (wciąż się podnosi) i ponieważ zostało poproszone, oto rozwiązanie, którego użyłem (z ElementStyle) na TextColumn (ale możesz zrobić to samo dla każdego typu DataGridColumn):

Zrobiłem to w kodzie za:

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

Ale jeśli chcesz to zrobić bezpośrednio w 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/doraprojects.net/template/agent.layouts/content.php on line 54
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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-13 04:47:09

Możesz też spróbować zmienić

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

Do

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

Co ciekawe, XAML WPF {0:#0.0000 } honoruje ten dodatkowy znak spacji w formacie renderowanej kontroli, aby przesunąć wartości poza krawędź kolumn siatki.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-21 18:03:41