65 votes

Modifier la couleur d'arrière-plan de l'élément ListBox sélectionné

Ceci est mon XAML jusqu'à présent.

     <ScrollViewer Grid.Column="1" Grid.RowSpan="2">

        <ListBox   Background="Black" ItemsSource="{Binding Path=ActiveLog}" >
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Background="Black">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="200"></ColumnDefinition>
                            <ColumnDefinition Width="*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition></RowDefinition>
                            <RowDefinition></RowDefinition>
                        </Grid.RowDefinitions>
                        <TextBlock Grid.Column="0" Grid.Row="0" Foreground="White">
                            <TextBlock >Date:</TextBlock>
                            <TextBlock  Text="{Binding Path=LogDate}"/>
                        </TextBlock>
                        <TextBlock Grid.Column="1" Grid.Row="0" Foreground="White">
                            <TextBlock >Severity:</TextBlock>
                            <TextBlock  Text="{Binding Path=Severity}"/>
                        </TextBlock>
                        <TextBlock Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="1" Foreground="LightGray" Text="{Binding Path=Message}"></TextBlock>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.Template>
                <ControlTemplate>
                    <StackPanel Background="Black" IsItemsHost="True" >
                    </StackPanel>
                </ControlTemplate>
            </ListBox.Template>

        </ListBox>
    </ScrollViewer>
 

Le seul problème est que l'élément sélectionné a une boîte bleue à droite. Je suppose qu'il y a un moyen de changer la couleur de sélection, mais je ne la trouve pas.

78voto

juFo Points 3779
 <UserControl.Resources>
    <Style x:Key="myLBStyle" TargetType="{x:Type ListBoxItem}">
        <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}"
                             Color="Transparent"/>
        </Style.Resources>
    </Style>
</UserControl.Resources> 
 

et

 <ListBox ItemsSource="{Binding Path=FirstNames}"
         ItemContainerStyle="{StaticResource myLBStyle}">  
 

Vous venez de remplacer le style du listboxitem (voir le: TargetType est ListBoxItem)

56voto

Blam Points 17325

Ou vous pouvez appliquer HightightBrushKey directement au ListBox. Setter Property = "Background" Value = "Transparent" ne fonctionnait PAS. Mais je devais définir le premier plan en noir.

     <ListBox  ... >
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True" >
                        <Setter Property="FontWeight" Value="Bold" />
                        <Setter Property="Background" Value="Transparent" />
                        <Setter Property="Foreground" Value="Black" />
                    </Trigger>
                </Style.Triggers>
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
                </Style.Resources>
            </Style>                
        </ListBox.ItemContainerStyle>
 

47voto

itowlson Points 44174

Vous devez utiliser la zone de liste.ItemContainerStyle.

ListBox.ItemTemplate spécifie la façon dont le contenu d'un élément doit être affiché. Mais WPF encore emballe chaque élément dans un ListBoxItem de contrôle, qui, par défaut, obtient son arrière-plan défini pour le système de surbrillance de couleur, si elle est sélectionnée. Vous ne pouvez pas arrêter de WPF de la création de la ListBoxItem les témoins, mais vous pouvez style-dans votre cas, afin de définir l'arrière-plan toujours être Transparent ou Noir ou n'importe quoi, et pour ce faire, vous utilisez ItemContainerStyle.

juFo réponse montre une possible mise en œuvre, par le "détournement" de l'arrière-plan du système de brosse de ressources dans le contexte de l'élément de style à un autre, peut-être plus idiomatiques technique est d'utiliser un Setter pour le Fond de la propriété.

30voto

RichS Points 1217

Je devais régler HighlightBrushKey et ControlBrushKey pour que le style soit correct. Sinon, tant qu'il aura le focus, il utilisera correctement le transparent HighlightBrusKey. Bt, si le contrôle perd la mise au point (alors qu'il est toujours en surbrillance), il utilise ControlBrushKey.

 <Style.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
</Style.Resources>
 

J'espère que cela aide quelqu'un.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X