在WPF中的dataGridCells上设置填充


68

一个简单的问题:如何在WPF中的dataGridCell上设置填充?(一次或所有单元格,我不在乎)

我尝试通过在DataGrid.CellStyle属性上添加setter来使用该DataGridCell.Padding属性,以及以DataGridColumn.CellStyle相同的方式使用该属性而没有任何效果。

我也尝试过使用该DataGridColumn.ElementStyle属性,但没有运气了。

我有点卡在那儿,有没有人设法在dataGridCell上应用填充?

注意:我要补充一点,不,我不能使用透明边框来做到这一点,因为我已经将border属性用于其他用途。我也不能使用margin属性(这似乎很有效,足够令人惊讶),因为我使用background属性,并且我不希望单元格之间有任何“空白”空间。

Answers:


129

问题在于Padding不会转移到Border的模板中的DataGridCell。您可以编辑模板并为其添加TemplateBindingPadding

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

4
好的,虽然我发现了另一种方法(虽然有点hack,但我的情况比较容易),但我接受了您的答案:通过使用ElementStyle属性在单元格的内容上设置margin属性。您的解决方案虽然更好。
大卫,

2
@David:是的,这将是另一种方式。无论完成什么工作:)
Fredrik Hedblad 2011年

14
我要补充一点,就我而言,这让我觉得WPF看起来还远远没有完成...
David

2
@FredrikHedblad您怎么知道在边框上将TemplateBinding应用于哪些属性?
回声

1
我已经为WPF团队提出了一个问题,以使这种情况变得更容易:github.com/dotnet/wpf/issues/2874
Kirill Osenkov '20

27

这是一种更干净的方法(我认为),结合了David的方法

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

然后...

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

(就我而言,我的行是只读的,因此没有EditingStyle)


12

将近5年后,由于此问题似乎仍然有用(它仍在投票中)并且由于已经提出要求,因此这是我在TextColumn上使用(与ElementStyle一起使用)的解决方案(但您可以对任何类型的DataGridColumn):

我在后面的代码中完成了这一切:

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

但是,如果您想直接在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>

2
<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

您也可以尝试更改

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

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

有趣的是,WPF的XAML {0:#0.0000}将以呈现的控件的格式使用此额外的空格字符,以将值移出网格列的边缘。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.