2009-01-29 10 views
5

Lorsqu'un utilisateur clique sur une ListBoxItem, je veux qu'il soit un fond rouge de la police plus gras jaunePourquoi ne puis-je pas définir la couleur d'arrière-plan d'un ListBoxItem sélectionné dans WPF?

Tout fonctionne, sauf l'arrière-plan. Il semble qu'il existe un arrière-plan standard (bleu) pour l'élément sélectionné. Comment est-ce que je remplace cela et change l'arrière-plan sélectionné en jaune?

Voici le code:

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

Répondre

12

Cela peut être fait beaucoup plus simple. La couleur d'arrière-plan des éléments ListBox sélectionnés provient des SystemColors. Donc, ce que vous devez faire est de remplacer les SystemColors dans les ressources de votre ListBox:

<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

Ne fonctionne pas dans .net 4.5, voir http://stackoverflow.com/questions/12710296/overriding-listboxitem-background-color-when-not-in-focus-net-4-5/12710338 –

2

Ce code devrait fonctionner pour la mise en arrière-plan. Le problème est que vous devez créer un ControlTemplate et affecter à la propriété Background du ContentPresenter la valeur "Jaune".

<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

Merci Frances !! Cela a fait pour moi, bien un peu. Voici mon code qui permet au modèle d'utiliser la propriété "StrColor" pour les éléments de liste sélectionnés et non sélectionnés.

<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

« Il peut être fait beaucoup plus simple. La couleur de fond pour les éléments ListBox sélectionnés sont pris des SystemColors. Donc, ce que vous devez faire est de passer outre les SystemColors en les ressources de votre ListBox »

Le concept de SystemColors majeur, quel modèle ListBoxItem utilisera pour arrière-plan/premier plan est terrible et souvent les gens embrouille qui sont nouveaux WPF. Ainsi, ma recommandation est de remplacer le modèle ListBoxItem et de le personnaliser.

Questions connexes