样式化在ContentPresenter中自动生成的文本块

时间:2011-08-17 11:35:13

标签: wpf datagrid datatemplate controltemplate

正如我所看到的,很多人遇到了这个确切的问题,但我无法理解为什么我的案子不起作用而且它开始让我发疯。

上下文:我有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>

不起作用。背景为绿色,但文字保持黑色和黑色。不大胆。

BTW,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但是...... {{1我的属性不适用,TextBlock仍然正常。

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

我无法得到我在这里失踪的东西。我尝试了,因为你几乎可以看到我在这里可能做的所有事情,并且TextBlock仍然没有格式化。

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

1 个答案:

答案 0 :(得分:2)

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}" .../> 时,都会在代码中设置此样式,这会覆盖您尝试设置的样式,即使您尝试隐式设置它也是如此。

据我所知,你必须为你的专栏重复这个

{{1}}