2009-01-29 44 views
5

当用户点击一个ListBoxItem,我想它是 一个大胆 较大 字体红色 背景黄色为什么我不能在WPF中设置选定ListBoxItem的背景颜色?

一切正常,除了背景。 似乎有一个标准(蓝色)的背景为选定的项目。 如何覆盖并将选定的背景变成黄色?

下面是代码:

<Window x:Class="AlternateListBox2.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300" 
    xmlns:local="clr-namespace:AlternateListBox2"> 
    <Window.Resources> 
     <local:Countries x:Key="countries"/> 
     <Style TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="Content" Value="{Binding Path=Name}"/> 
      <Setter Property="Margin" Value="2"/> 
      <Style.Triggers> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="FontWeight" Value="Bold"/> 
        <Setter Property="FontSize" Value="18"/> 
        <Setter Property="Background" Value="Yellow"/> 
        <Setter Property="Foreground" Value="Red"/> 
       </Trigger> 
      </Style.Triggers> 

     </Style> 
    </Window.Resources> 
    <StackPanel> 
     <ListBox 
      ItemsSource="{Binding Source={StaticResource countries}}" 
      Width="100" 
      Margin="10" 
      HorizontalAlignment="Left" 
      /> 
    </StackPanel> 
</Window> 

回答

12

它可以做得更简单。所选ListBox项目的背景颜色来自SystemColors。因此,您需要做的是覆盖ListBox资源中的SystemColors:

<ListBox.Resources> 
    <!--Selected color when the ListBox is focused--> 
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Yellow" /> 
    <!--Selected color when the ListBox is not focused--> 
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Yellow" /> 
</ListBox.Resources> 
+3

无法在.net 4.5中使用,请参阅http://stackoverflow.com/questions/12710296/overriding-listboxitem-background-color-when-not-in-focus-net-4-5/12710338 – 2012-10-03 15:23:24

2

此代码应设置后台工作。问题是您需要创建一个ControlTemplate并将ContentPresenter的Background属性赋值为“Yellow”。

<Style x:Key="ListBoxItemStyle1" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" x:Name="contentPresenter"/> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="true"> 
          <Setter Property="OpacityMask" TargetName="contentPresenter" Value="{x:Null}"/> 
          <Setter Property="Background" TargetName="Bd" Value="Yellow"/> 
          <Setter Property="FontWeight" Value="Bold"/> 
          <Setter Property="FontSize" Value="18"/> 
          <Setter Property="Foreground" Value="Red"/> 
         </Trigger> 
         <MultiTrigger> 
          <MultiTrigger.Conditions> 
           <Condition Property="IsSelected" Value="true"/> 
           <Condition Property="Selector.IsSelectionActive" Value="false"/> 
          </MultiTrigger.Conditions> 
          <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
         </MultiTrigger> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
0

感谢Frances !!这对我来说确实有点。这里是我的代码,它允许模板为选定和未选择的列表项目使用“StrColor”属性。

<Style TargetType="ListBoxItem"> 
     <Setter Property="HorizontalContentAlignment" Value="Center"/> 
     <Setter Property="VerticalContentAlignment" Value="Center"/> 
     <!--Nice Brush--> 
     <Setter Property="Background"> 
      <Setter.Value> 
       <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
        <!-- This is a gradient from white to StrColor and back to white --> 
        <!--<GradientStop Color="White" Offset="0"/> 
        <GradientStop Color="{Binding Path=StrColor}" Offset="0.445"/> 
        <GradientStop Color="White" Offset="1"/> 
        <GradientStop Color="{Binding Path=StrColor}" Offset="0.53"/>--> 
        <!-- This is a gradient from StrColor to white --> 
        <GradientStop Color="{Binding Path=StrColor}" Offset="0"/> 
        <GradientStop Color="White" Offset="1"/> 
       </LinearGradientBrush> 
      </Setter.Value> 
     </Setter> 
     <!--Standard Color--> 
     <!--<Setter Property="Background" Value="{Binding Path=StrColor}"/>--> 
     <Setter Property="Foreground" Value="{Binding Path=TextColor}"/> 
     <Setter Property="Height" Value="{Binding Path=Height}"/> 
     <Setter Property="Margin" Value="0"/> 
     <Setter Property="Focusable" Value="False"/> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Border x:Name="Bd" SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}"> 
         <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" x:Name="contentPresenter"/> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsSelected" Value="true"> 
          <Setter Property="OpacityMask" TargetName="contentPresenter" Value="{x:Null}"/> 
          <Setter Property="Background" TargetName="Bd"> 
           <Setter.Value> 
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
             <GradientStop Color="{Binding Path=StrColor}" Offset="0"/> 
             <GradientStop Color="White" Offset="1"/> 
            </LinearGradientBrush> 
           </Setter.Value> 
          </Setter> 
          <Setter Property="Foreground" Value="{Binding Path=TextColor}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

</UserControl.Resources> 
2

“这是可以做到简单了很多。选定 列表框项目的背景颜色从systemColors中取出。所以,你需要 做的是覆盖systemColors中的ListBox的资源“

覆盖SystemColors,ListBoxItem模板将用于背景/前景的概念很糟糕,并且经常会混淆对WPF不熟悉的人。 因此,我的建议是重写ListBoxItem模板并对其进行自定义。

相关问题