在 WPF 中为 dataGridCell 设置一个空白

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

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

我还尝试使用 DataGridColumn.ElementStyle属性,但没有更多的运气。

我有点困在那里了,有人设法在 dataGridCell 上应用了填充吗?

注意: 我要补充的是,我不能使用透明边框来做这件事,因为我已经为其他事情使用了边框属性。我也不能使用边距属性(这似乎工作,令人惊讶的足够) ,因为我使用的背景属性,我不希望我的单元格之间有任何“空白”空间。

56870 次浏览

问题是 Padding没有转移到 DataGridCell模板中的 Border。您可以编辑 Template 并为 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>

你也可以试着改变

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

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

有趣的是,WPF 的 XAML {0: # 0.0000}将以呈现的控件的格式尊重这个额外的空格字符,从而将您的值从网格列的边缘移开。

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

这里有一个更干净的方法(我的观点) ,它结合了大卫的方法

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

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