我想在WPF中编辑DataGrid
的单元格样式。因此,使用Expression Blend,我转到 - 对象和时间线>> DataGrid>>编辑其他模板>>编辑CellStyle>>编辑副本
以下是页面上显示的内容:
<SolidColorBrush x:Key="{x:Static DataGrid.FocusBorderBrushKey}" Color="#FF000000"/>
<Style x:Key="DataGridCellStyle1" TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="BorderBrush" Value="{DynamicResource {x:Static DataGrid.FocusBorderBrushKey}}"/>
</Trigger>
</Style.Triggers>
</Style>
但我只想改变填充和背景。相反,它给了我25行代码,包括单元格模板!我错过了什么,有没有更好的方式来设置这样的项目,而不必在我只想更改两个项目时带来如此多的额外不必要的代码?
答案 0 :(得分:35)
查看&#34; BasedOn &#34;样式的属性......
例如,以下样式从 DataGridColumnHeader 获取所有内容,并仅覆盖 HorizontalContentAlignment 属性:
<Style x:Key="CenterAlignedColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}"
BasedOn="{StaticResource {x:Type DataGridColumnHeader}}">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
答案 1 :(得分:3)
在WPF中覆盖控件模板要求您完全替换模板。您可能只想更改模板的一个方面,但结果是表达式转储模板其余部分的副本,以便可以覆盖它。确保你以正确的方式覆盖牢房(我不确定还有另一种方式)。一些控件(ListView
会浮现在脑海中)会让您换出数据模板而不会覆盖整个控件模板,但我不确定这是您想要的,或者是否可以使用DataGrid
完成。
答案 2 :(得分:2)
要做你想做的事情,通常只需要设置风格的背景和填充属性:
<Style TargetType="DataGridCell">
<Setter Property="Padding" Value="10" />
<Setter Property="Background" Value="Green" />
</Style>
但是在这种情况下,似乎DataGridCell的默认控件模板忽略了填充值,因此您需要将其替换为不具有填充值的实现。以下内容基于您发布的默认模板:
<Style TargetType="DataGridCell">
<Setter Property="Padding" Value="10" />
<Setter Property="Background" Value="Green" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
SnapsToDevicePixels="True">
<ContentPresenter
Margin="{TemplateBinding Padding}" <!-- this bit does the padding -->
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>