在WPF中的dataGridCells上设置填充

时间:2011-03-09 13:52:40

标签: wpf datagrid styling

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

我尝试使用DataGrid.CellStyle属性,在DataGridCell.Padding属性上添加一个setter,并以相同的方式使用DataGridColumn.CellStyle属性,但没有效果。

我也尝试使用DataGridColumn.ElementStyle属性而没有更多运气。

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

注意:我会补充说不,我不能使用透明边框来执行此操作,因为我已经将边框属性用于其他内容。我也不能使用margin属性(这看起来很有效,令人惊讶的是)因为我使用了background属性而且我不希望我的单元格之间有任何“空白”空间。

5 个答案:

答案 0 :(得分:109)

问题是Padding未转移到Border模板中的DataGridCell。您可以编辑模板并为Padding

添加TemplateBinding
<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>

答案 1 :(得分:17)

这是一种更清洁的方法(我认为),结合了大卫的方法

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

答案 2 :(得分:8)

差不多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>

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您也可以尝试更改

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

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

有趣的是,WPF的XAML {0:#0.0000}将以渲染控件的格式表示这个额外的空格字符,以便将您的值移出网格列的边缘。