这是我之前的问题之后的一个问题,你可以在那里找到它 https://stackoverflow.com/questions/7092145/styling-a-textblock-autogenerated-in-a-contentpresenter
所以。现在我定义了一个DataGrid
具有特定的ElementStyle
对于每一列(它只是定义TextBlock
里面的粗体和白色——稍后会解决这个问题)
所以现在我有两个问题
第一个问题(已解决)
当我碰巧为单元格设置背景时,它会覆盖默认样式,并且当单元格突出显示时背景保持不变。
一种风格的一个例子:
<!-- Green template for market-related -->
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}">
<Grid Background="Green">
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
我自然会说这是“正常”,因为我设置了Grid
以绿色为背景。因此我尝试了这样的方法:
<!-- Light green template for sophis-related -->
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}">
<Grid Background="LightGreen">
<Grid.Resources>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}},
Converter={StaticResource DebugConverter}}" Value="True">
<Setter Property="Grid.Background" Value="#FF3774FF" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
这也行不通。正如你所看到的,我放置了一个 DebugConverter,这样我就可以检查触发器是否实际被调用,情况就是如此,但是......背景没有改变(并且 Snoop 确认了这一点......)
第三次尝试:
<!-- Light green template for sophis-related -->
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}">
<ControlTemplate.Resources>
<Style TargetType="{x:Type tk:DataGridCell}">
<Setter Property="Background" Value="LightGreen" />
</Style>
</ControlTemplate.Resources>
<Grid>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
并且...不会显示背景(保持透明)
所以我认为我在这里工作的方式是错误的,我想知道我应该做什么来定义“未选择”模板。
我想说我可能需要定义一个基于“经典”样式的样式,但是,我该怎么做呢?我尝试添加 TemplateBindings 但没有成功
** 编辑:解决方案**
正如 H B 在他的回答中所建议的,问题来自 DependencyProperty Precedence,解决方案如下:
<!-- Light green template for sophis-related -->
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}">
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}},
Converter={StaticResource DebugConverter}}" Value="True">
<Setter Property="Grid.Background" Value="#FF316AC5" />
</DataTrigger>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}},
Converter={StaticResource DebugConverter}}" Value="False">
<Setter Property="Grid.Background" Value="LightGreen" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
第二个问题
现在,我们来谈谈Triggers
.
基本上,我想做的是定义具体的Triggers
to my ElementStyle
因此,如果单元格的背景是红色或绿色,则字体颜色为白色(这样做的唯一目的是具有更好的可读性,因为红色和绿色有点暗,深色背景上的黑色字体会导致很好的失败:p)
Edit好像我还不够清楚:以下样式是通过属性应用于数据网格的每个项目的样式DataGridTextColumn.ElementStyle
。这是处理该问题的代码:
void VolatilityDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataGridTextColumn column = e.Column as DataGridTextColumn;
column.ElementStyle = s_boldCellStyle;
// Other stuff here...
}
这是我所做的:
<!-- Cell style for colored matrix-->
<Style x:Key="BoldCellStyle" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}}"
Value="Red">
<Setter Property="Foreground" Value="White" />
</DataTrigger>
<DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}},
Converter={StaticResource DebugConverter}}"
Value="Green">
<Setter Property="Foreground" Value="White" />
</DataTrigger>
</Style.Triggers>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
而且……这不起作用。奇怪的是,通过转换器的只是透明的背景颜色。我在这里肯定错过了一些东西!
顺便说一句,我也尝试过经典触发器,也没有成功,我使用DataTriggers
在这里我可以调试绑定值!
现在我已经在这个问题上被困了三天多了,我开始害怕了......希望 Stackoverflow 社区能拯救我:)
Thanks!
Edit
好的,更新一下。
我明白为什么我的Trigger
不起作用。实际设置的背景位于Grid
并且不在DataGridCell
。因此,我在那里没有设置任何颜色是正常的。
但是,我进行了一些测试,发现当设置绑定时,TextBlock
还没有任何父级(Parent
= 空)。绑定到一个RelativeSource
类型的Grid
将把我束缚在……整个DataGrid
项目主持人。
我不知道现在该怎么办,因为从实际情况来看似乎是这样TextBlock
我无法联系到父母的风格Grid
因此无法根据背景决定我应该显示什么颜色。
另外,我无法更改我的字体颜色ControlTemplate
因为DataGrid
想要一个Style
对于每一列,默认情况下会覆盖模板的样式(请参阅我之前的问题及其答案) https://stackoverflow.com/questions/7092145/styling-a-textblock-autogenerated-in-a-contentpresenter所以...我又被困住了!