如何覆盖所选 ListBoxItem 的前景

How to override Foreground for selected ListBoxItem

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

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

这很好用。

现在我尝试覆盖所选 ListBoxItem 中 TextBlock 的前景,这是默认 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的全局风格的画笔形式。 在与绑定一起使用的解决方案中设置前景的最佳方式是什么?

这个例子说明了为什么定义隐式 application-wide 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>