如何覆盖所选ListBoxItem的前景

时间:2018-03-18 20:12:43

标签: wpf xaml app.xaml

我有一个全局样式(Application.Resources)来设置所有TextBlocks的前景。

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

这很好用。

现在我尝试覆盖所选ListBoxItem内的TextBlock的Foreground,它是默认ContentPresenter内容的一部分。

我为ListBoxItem创建了一个新的全局样式:

<Style TargetType="ListBoxItem">
    <Setter Property="Foreground" Value="Orange" />
    <Setter Property="Background" Value="Aqua"/>

    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBoxItem">
                <Border Background="{TemplateBinding Background}">
                    <ContentPresenter/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

    <Style.Triggers>
        <Trigger Property="IsSelected" Value="True">
            <Setter Property="Background" Value="Brown" />
            <Setter Property="Foreground" Value="Aqua" />
        </Trigger>
    </Style.Triggers>
</Style>

背景工作正常。

但Foreground仍然是TextBlock的全局样式。 在使用Binding的解决方案中设置Foreground的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

这是为什么定义隐式应用程序范围的TextBlock样式通常是个坏主意的一个示例。

但您应该可以通过向<ContentPresenter.Resources>添加默认样式来覆盖它:

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="ListBoxItem">
            <Border Background="{TemplateBinding Background}">
                <ContentPresenter>
                    <ContentPresenter.Resources>
                        <Style TargetType="{x:Type TextBlock}" BasedOn="{x:Null}" />
                    </ContentPresenter.Resources>
                </ContentPresenter>
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>