Dam*_*cus 5 wpf datagrid styles controltemplate
这是我之前的问题之后的一个问题,你可以在那里找到它
所以。现在我为每一列定义了DataGrid一个特定ElementStyle的(它只是TextBlock用粗体和白色定义了里面的s - 稍后会解决这个问题)
所以现在我有两个问题
第一个问题(已解决)
当我为我的单元格设置背景时,它会覆盖默认样式,并且当单元格突出显示时背景保持不变。
一种风格的例子:
<!-- Green template for market-related -->
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}">
<Grid Background="Green">
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
我自然会说这是“正常的”,因为我将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>
Run Code Online (Sandbox Code Playgroud)
这也行不通。正如你所看到的,我放置了一个 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>
Run Code Online (Sandbox Code Playgroud)
而且...不会显示背景(保持透明)
所以我认为我在这里以错误的方式工作,我想知道我应该怎么做才能定义“未选择”模板。我会说我可能需要定义一个基于“经典”样式的样式但是,我该怎么做?我尝试添加 TemplateBindings 没有成功
** 编辑:解决方案**
正如 HB 在他的回答中所建议的,问题来自 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>
Run Code Online (Sandbox Code Playgroud)
第二个问题
现在,让我们说话Triggers。
基本上,我想要做的是定义特定Triggers于我ElementStyle的字体颜色,如果单元格的背景是红色或绿色,则字体颜色为白色(这样做的唯一目的是提高可读性,因为红色和绿色有点暗,黑色字体在深色背景会导致很好的失败:p)
编辑好像我不够清楚:以下样式是通过属性应用于数据网格的每个项目的样式DataGridTextColumn.ElementStyle。这是代码处理:
void VolatilityDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataGridTextColumn column = e.Column as DataGridTextColumn;
column.ElementStyle = s_boldCellStyle;
// Other stuff here...
}
Run Code Online (Sandbox Code Playgroud)
这是我所做的:
<!-- 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>
Run Code Online (Sandbox Code Playgroud)
而且......它不起作用。奇怪的是,通过转换器的只是透明的背景颜色。我肯定在这里错过了一些东西!顺便说一句,我也尝试过使用经典触发器,但也没有成功,我DataTriggers在这里使用以便调试绑定值!
现在我在这件事上被困了三天多,我开始害怕了......希望 Stackoverflow 社区能救我 :)
谢谢!
编辑
好的,更新。我明白为什么我的Trigger不起作用。实际设置的背景是在 上Grid而不是在DataGridCell. 因此,我没有在那里设置任何颜色是正常的。
但是,我运行了一些测试,发现当设置绑定时,TextBlock还没有任何父级(Parent= null)。绑定到RelativeSource类型Grid将绑定我...整个DataGrid项目演示者。我不知道现在该怎么办,因为从实际TextBlock样式看来,我无法联系到父级Grid,因此无法根据背景确定我应该显示什么颜色。此外,我无法更改我的字体颜色,ControlTemplate因为每列DataGrid都需要一个Style,默认情况下会覆盖模板的样式(请参阅我之前的问题及其答案)
所以......我又卡住了!
这:
<Grid Background="LightGreen">
<Grid.Resources>
<Style TargetType="{x:Type Grid}">
<!-- Trigger Stuff -->
</Style>
</Grid.Resources>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
需要是:
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type Grid}">
<Setter Property="Background" Value="LightGreen"/>
<!-- Trigger Stuff -->
</Style>
</Grid.Resources>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
Run Code Online (Sandbox Code Playgroud)
目前不确定你的第二个问题,可能是一个相关的问题,我建议设置TextElement.Foreground而不是Foreground初学者。获取Transparent值并不是很有帮助,您使用什么控件模板DataGridCell?如果是定制的,是否Background通过 正确连接TemplateBinding?
只要Background使用该属性,这就有效,因此,如果您有一个ControlTemplate在内部设置内容的属性,则需要将其外部化。一个正常的DataGrid例子:
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="LightGreen"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Content}" Value="Apple">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding Content}" Value="Tomato">
<Setter Property="Background" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
Run Code Online (Sandbox Code Playgroud)
<Style TargetType="TextBlock">
<Style.Triggers>
<DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}}" Value="Red">
<Setter Property="Foreground" Value="White"/>
</DataTrigger>
<DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource AncestorType={x:Type DataGridCell}}}" Value="Green">
<Setter Property="Foreground" Value="White"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
因此,如果CellStyle设置了ControlTemplate属性,则需要通过 TemplateBinding 连接。例如
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridCell}">
<Grid Background="{TemplateBinding Background}">
<ContentPresenter />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Background" Value="LightGreen"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Content}" Value="Apple">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding Content}" Value="Tomato">
<Setter Property="Background" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>
Run Code Online (Sandbox Code Playgroud)
不要在模板内进行触发,否则会变得混乱。
| 归档时间: |
|
| 查看次数: |
16183 次 |
| 最近记录: |