在 WPF 中更改 ListBoxItem 的选择颜色

Change Selection Color of ListBoxItem in WPF

抱歉,我的问题是多余的,例如这些问题:

但无论出于何种原因,无论是更改 ItemContainerStyle 还是覆盖 SystemColors 都不适合我。有人能告诉我我必须在此 XAML 代码中更改什么才能将所选 ListBoxItems(或更准确地说是它们周围的 ItemsContainer)的背景颜色更改为红色吗?我设置的所有其他颜色都已正确分配。

<ListBox>
    <ListBox.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightColorKey}" Color="Red" />
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Red" />
        <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey }" Color="Red" />
    </ListBox.Resources>

    <ListBox.ItemContainerStyle>
        <Style TargetType="{x:Type ListBoxItem}">
            <Setter Property="Foreground" Value="HotPink"/>
            <Setter Property="Background" Value="Yellow"/>
            <Setter Property="Margin" Value="2"/>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="Green"/>
                    <Setter Property="Background" Value="Red"/>
                </Trigger>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="Foreground" Value="Green"/>
                    <Setter Property="Background" Value="Red"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </ListBox.ItemContainerStyle>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>

    <ListBoxItem>A</ListBoxItem>
    <ListBoxItem>B</ListBoxItem>
    <ListBoxItem>C</ListBoxItem>
    <ListBoxItem>D</ListBoxItem>
</ListBox>

这两种方法都不起作用,因为:

  • 默认控件模板不一定使用系统颜色。
  • 默认控件模板触发器 precedence 覆盖您的样式设置器。

您必须 extract the default style 并控制模板,例如通过使用 Visual Studio 或 Blend 以获得一个工作基础。调整控件模板触发的样式中的颜色。

<SolidColorBrush x:Key="Item.MouseOver.Background"
                 Color="#1F26A0DA" />
<SolidColorBrush x:Key="Item.MouseOver.Border"
                 Color="#a826A0Da" />
<SolidColorBrush x:Key="Item.SelectedActive.Background"
                 Color="#3D26A0DA" />
<SolidColorBrush x:Key="Item.SelectedActive.Border"
                 Color="#FF26A0DA" />
<SolidColorBrush x:Key="Item.SelectedInactive.Background"
                 Color="#3DDADADA" />
<SolidColorBrush x:Key="Item.SelectedInactive.Border"
                 Color="#FFDADADA" />
<Style x:Key="FocusVisual">
   <Setter Property="Control.Template">
      <Setter.Value>
         <ControlTemplate>
            <Rectangle Margin="2"
                       StrokeDashArray="1 2"
                       SnapsToDevicePixels="true"
                       StrokeThickness="1"
                       Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" />
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>
<Style x:Key="ListBoxItemStyle"
       TargetType="{x:Type ListBoxItem}">
   <Setter Property="SnapsToDevicePixels"
           Value="True" />
   <Setter Property="Padding"
           Value="4,1" />
   <Setter Property="HorizontalContentAlignment"
           Value="{Binding HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
   <Setter Property="VerticalContentAlignment"
           Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" />
   <Setter Property="Background"
           Value="Transparent" />
   <Setter Property="BorderBrush"
           Value="Transparent" />
   <Setter Property="BorderThickness"
           Value="1" />
   <Setter Property="FocusVisualStyle"
           Value="{StaticResource FocusVisual}" />
   <Setter Property="Template">
      <Setter.Value>
         <ControlTemplate TargetType="{x:Type ListBoxItem}">
            <Border x:Name="Bd"
                    Background="{TemplateBinding Background}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    Padding="{TemplateBinding Padding}"
                    SnapsToDevicePixels="true">
               <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                 SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                 VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
            </Border>
            <ControlTemplate.Triggers>
               <MultiTrigger>
                  <MultiTrigger.Conditions>
                     <Condition Property="IsMouseOver"
                                Value="True" />
                  </MultiTrigger.Conditions>
                  <Setter Property="Background"
                          TargetName="Bd"
                          Value="{StaticResource Item.MouseOver.Background}" />
                  <Setter Property="BorderBrush"
                          TargetName="Bd"
                          Value="{StaticResource Item.MouseOver.Border}" />
               </MultiTrigger>
               <MultiTrigger>
                  <MultiTrigger.Conditions>
                     <Condition Property="Selector.IsSelectionActive"
                                Value="False" />
                     <Condition Property="IsSelected"
                                Value="True" />
                  </MultiTrigger.Conditions>
                  <Setter Property="Background"
                          TargetName="Bd"
                          Value="{StaticResource Item.SelectedInactive.Background}" />
                  <Setter Property="BorderBrush"
                          TargetName="Bd"
                          Value="{StaticResource Item.SelectedInactive.Border}" />
               </MultiTrigger>
               <MultiTrigger>
                  <MultiTrigger.Conditions>
                     <Condition Property="Selector.IsSelectionActive"
                                Value="True" />
                     <Condition Property="IsSelected"
                                Value="True" />
                  </MultiTrigger.Conditions>
                  <Setter Property="Background"
                          TargetName="Bd"
                          Value="{StaticResource Item.SelectedActive.Background}" />
                  <Setter Property="BorderBrush"
                          TargetName="Bd"
                          Value="{StaticResource Item.SelectedActive.Border}" />
               </MultiTrigger>
               <Trigger Property="IsEnabled"
                        Value="False">
                  <Setter Property="TextElement.Foreground"
                          TargetName="Bd"
                          Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" />
               </Trigger>
            </ControlTemplate.Triggers>
         </ControlTemplate>
      </Setter.Value>
   </Setter>
</Style>

然后通过显式引用在您的 ListBox 中使用样式,或者通过省略 x:Key 使其成为隐式样式样式,这样它将应用于所有 ListBoxItem范围。

<ListBox ItemContainerStyle="{StaticResource ListBoxItemStyle}">