1

我有两种样式设置在我的UserControl.Resources

    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="Foreground" Value="white" />
    </Style>
    <Style TargetType="{x:Type Label}">
        <Setter Property="Foreground" Value="white" />
    </Style>

因此,在我的(并注意我将其余部分切掉)中,我将应用白色文本,而DataTemplate无需更改每个元素的属性。LabelTextBlock

<DataTemplate x:Key="FileTransferItemTemplate">
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Horizontal">
                <Label Content="Transferring With: " />
                <TextBlock Text="{Binding Path=OtherUserName, Mode=TwoWay}" />
            </StackPanel>
</DataTemplate>

但是会发生什么(这让我做了一个漫长的噩梦,我认为我的数据绑定不正确,因为我看不到任何更改),当数据被绑定时,前景色默认为黑色。我的数据绑定文本在黑色背景上是黑色的,我什至没有意识到最长的时间。

我可以覆盖它的唯一方法是手动设置Foreground="White". TextBlock颜色的Label效果很好,因为它不是数据绑定的。

为什么会发生这种情况,我该如何解决?

4

1 回答 1

3

该问题与绑定无关。似乎从 DataTemplate 内部查找外部定义的默认样式仅适用于从 Control 派生的元素。由于 TextBlock 不是从 Control 派生的,因此找不到您的默认样式。

本页引用了微软给出的以下两条声明:

这种行为是“设计使然”,这就是原因。模板被视为封装边界。这些模板生成的元素属于此边界。并在此边界处停止查找具有匹配 TargetType 的样式。因此,通过模板生成的复制中的 TextBlock 不会选择有问题的样式。而在模板外部定义的 TextBlock 则可以。解决此问题的一种方法是为样式指定一个显式名称,并通过该名称在模板内的 TextBlock 上引用该样式。

在查找不是 Control 子类型的元素的隐式样式时,模板被视为封装边界。

于 2013-01-05T22:25:29.560 回答