2009-01-29 33 views
5

Khi người dùng nhấp vào một ListBoxItem, tôi muốn nó được một đậm lớn phông chữ màu đỏ nền vàngTại sao tôi không thể đặt màu nền của một ListBoxItem được chọn trong WPF?

Mọi thứ hoạt động trừ nền. Dường như có nền tiêu chuẩn (màu xanh dương) cho mục đã chọn. Làm cách nào để ghi đè và thay đổi màu nền đã chọn?

Đây là mã:

<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> 

Trả lời

12

Có thể làm đơn giản hơn rất nhiều. Màu nền cho các mục ListBox đã chọn được lấy từ các SystemColors. Vì vậy, những gì bạn cần làm là ghi đè các SystemColors trong phần Tài nguyên của ListBox của bạn:

<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

Không hoạt động trong .net 4.5, xem http://stackoverflow.com/questions/12710296/overriding-listboxitem-background-color-when-not-in-focus-net-4-5/12710338 –

2

Mã này nên làm việc để thiết lập nền. Vấn đề là bạn cần tạo một ControlTemplate và gán cho thuộc tính Background của ContentPresenter giá trị "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

Cảm ơn Frances !! Điều đó đã làm cho tôi, cũng phần nào. Đây là mã của tôi cho phép mẫu sử dụng thuộc tính "StrColor" cho các mục danh sách được chọn và không được chọn.

<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

"Nó có thể được thực hiện đơn giản hơn rất nhiều. Màu nền cho chọn mục ListBox được lấy từ SystemColors. Vì vậy, những gì bạn cần làm là ghi đè lên SystemColors trong Tài nguyên của ListBox của bạn "

Khái niệm ghi đè SystemColors, mà mẫu ListBoxItem sẽ sử dụng cho nền/tiền cảnh là khủng khiếp và thường gây nhầm lẫn cho những người mới sử dụng WPF. Do đó, đề xuất của tôi là ghi đè mẫu ListBoxItem và tùy chỉnh nó.

Các vấn đề liên quan