gpt4 book ai didi

wpf - 正确设置 DataGridCell 样式

转载 作者:行者123 更新时间:2023-12-03 18:14:11 25 4
gpt4 key购买 nike

这是我之前的问题 you can find it right there 之后的一个问题

所以。现在我定义了一个 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给我的 ElementStyle因此,如果单元格的背景是红色或绿色,则字体颜色为白色(这样做的唯一目的是提高可读性,因为红色和绿色有点暗,深色背景上的黑色字体会导致失败:p)

编辑 好像我不够清楚:以下样式是通过属性 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在这里,我可以调试绑定(bind)值!

现在我已经被困了三天多,我开始吓坏了……希望 Stackoverflow 社区能救我:)

谢谢!

编辑

好的,更新。
我明白为什么我的 Trigger不起作用。实际设置的背景位于 Grid而不是 DataGridCell .因此,我没有在那里设置任何颜色是正常的。

但是,我进行了一些测试,发现设置绑定(bind)后, TextBlock还没有任何父级( Parent = null)。绑定(bind)到 RelativeSource类型 Grid会把我束缚在……整个 DataGrid项目演示者。
我不知道现在该做什么,因为实际的 TextBlock 似乎是这样的。我无法联系到 parent 的样式 Grid因此无法解决我应该根据背景显示什么颜色。
另外,我无法更改 ControlTemplate 中的字体颜色因为 DataGrid想要一个 Style对于每一列,默认覆盖模板的样式 (see my previous question and its answer)
所以……我又卡住了!

最佳答案

Dependency Property Value Precedence

这:

<Grid Background="LightGreen">
<Grid.Resources>
<Style TargetType="{x:Type Grid}">
<!-- Trigger Stuff -->
</Style>
</Grid.Resources>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

需要是:
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type Grid}">
<Setter Property="Background" Value="LightGreen"/>
<!-- Trigger Stuff -->
</Style>
</Grid.Resources>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>

目前不确定您的第二个问题,可能是相关问题,我建议设置 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>
<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>

所以如果 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>

不要在模板内进行触发,否则会变得困惑。

关于wpf - 正确设置 DataGridCell 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7107044/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com