gpt4 book ai didi

wpf - 在 ContentPresenter 中设置自动生成的 Textblock 样式

转载 作者:行者123 更新时间:2023-12-04 21:23:53 28 4
gpt4 key购买 nike

正如我所看到的,很多人都遇到了这个确切的问题,但我不明白为什么我的案例不起作用,它开始让我发疯。

上下文:我有一个 DataGrid这是根据每个单元格的值着色的。因此,我有一个动态样式来解析要用于每个单元格的实际模板。背景现在相应地工作。

新问题:当我有深色背景时,我希望字体颜色为白色,字体粗细为粗体,以便文本正确可读。而且......我无法正确设计它。

我阅读了一些关于此的 Stackoverflow 帖子:

This one fits my problem but doesn't provide me any working solution
This one is also clear and detail but... duh
This is almost the same problem as me but... Solution does not work

这是我到目前为止尝试过的:

<!-- Green template-->
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}">
<Grid Background="Green">
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ContentPresenter.Resources>
<Style BasedOn="{StaticResource BoldCellStyle}" TargetType="{x:Type TextBlock}" />
</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
</ControlTemplate>

不起作用。背景是绿色,但文本保持黑色而不是粗体。

顺便说一句,BoldCellStyle 非常简单:
<Style x:Key="BoldCellStyle" TargetType="{x:Type TextBlock}">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="White" />
</Style>

好的。第二次尝试(这是一个真正愚蠢的尝试,但很好......)
<!-- Green template  -->
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}">
<Grid Background="Green">
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ContentPresenter.Resources>
<Style x:Key="BoldCellStyle" TargetType="{x:Type TextBlock}">
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Foreground" Value="White" />
</Style>

</ContentPresenter.Resources>
</ContentPresenter>
</Grid>
</ControlTemplate>

也不行。

然后,我试着玩 ContentPresenter的属性:
<!-- Green template -->
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}">
<Grid Background="Green">
<ContentPresenter TextElement.FontWeight="Bold" TextElement.Foreground="White" TextBlock.Foreground="White"
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>

而且...正如您所料,这甚至不起作用。

出于好奇,我使用 Snoop 浏览了我界面的所有组件。
在前两种情况下,Snoop 实际上向我展示了每个单元格都是 GridContentPresenter包含 TextBlock和实际 Style但是... TextBlock的属性不适用和 FontWeight还是正常的。

最后一个案例,更令人震惊的是,我可以看到窥探告诉我我们实际上有一个 ContentPresenter具有正确的属性(即 TextElement.FontWeight="Bold" ),但自动生成的 TextBlock下面是 - 仍然 - 没有风格。

我无法得到我在这里想念的东西。我尝试了你可以看到的几乎所有我能在这里做的事情,还有 TextBlock s 保持未格式化。

这里有什么想法吗?再次感谢!

最佳答案

DataGridColumns源自 DataGridBoundColumn (除 DataGridTemplateColumn 外的所有)都有一个属性 ElementStyle应用于 TextBlock创建时。例如DataGridTextColumn看起来像这样

static DataGridTextColumn()
{
ElementStyleProperty.OverrideMetadata(typeof(DataGridTextColumn),
new FrameworkPropertyMetadata(DefaultElementStyle));
// ...
}

它覆盖 ElementStyle 的元数据并提供了一个新的默认值, DefaultElementStyle ,它基本上只是设置 TextBlock 的默认边距.
public static Style DefaultElementStyle
{
get
{
if (_defaultElementStyle == null)
{
Style style = new Style(typeof(TextBlock));
// Use the same margin used on the TextBox to provide space for the caret
style.Setters.Add(new Setter(TextBlock.MarginProperty, new Thickness(2.0, 0.0, 2.0, 0.0)));
style.Seal();
_defaultElementStyle = style;
}
return _defaultElementStyle;
}
}

每次新 DataGridCell 时都会在代码中设置此样式是用 element.Style = style; 创建的这会覆盖您尝试设置的样式,即使您尝试隐式设置它。

据我所知,您必须为您的专栏重复此操作
<DataGridTextColumn Header="Column 1" ElementStyle="{StaticResource BoldCellStyle}" .../>
<DataGridTextColumn Header="Column 2" ElementStyle="{StaticResource BoldCellStyle}" .../>

关于wpf - 在 ContentPresenter 中设置自动生成的 Textblock 样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7092145/

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