更改所选ListBox项目的背景颜色

这是我的XAML到目前为止。

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

唯一的问题是所选的项目右边有一个蓝色框。 我认为有一种方法来改变select颜色,但我找不到它。

你需要使用ListBox.ItemContainerStyle 。

ListBox.ItemTemplate指定应该如何显示一个项目的内容 。 但是,WPF仍然将每个项目包装在一个ListBoxItem控件中,默认情况下,它的背景设置为系统高亮颜色(如果选中)。 你不能停止WPF创buildListBoxItem控件,但是你可以对它们进行样式设置 – 在你的情况下,将背景设置为透明或者黑色或者其他任何东西 – 为此,你使用ItemContainerStyle。

juFo的回答显示了一个可能的实现方式,通过在项目风格的上下文中“劫持”系统背景画笔资源; 另外,也许更习惯的技巧是使用Setter作为Background属性。

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

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

您只需重写listboxitem的样式(请参阅:TargetType是ListBoxItem)

或者你可以将HighlightBrushKey直接应用到列表框。 Setter Property =“Background”Value =“透明”不起作用。 但是我必须将前景设置为黑色。

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

我不得不设置HighlightBrushKey和ControlBrushKey让它正确的风格。 否则,虽然它有焦点,这将正确使用透明的HighlightBrusKey。 Bt,如果控件失去焦点(虽然仍然突出显示),那么它使用ControlBrushKey。

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

希望这可以帮助别人。

如果select不重要,最好使用包装在ScrollViewer中的ItemsControl。 这个组合比Listbox(实际上已经从ItemsControl派生)更加轻量级,并且使用它将消除使用便宜的hack覆盖已经从ItemsControl中缺less的行为的需要。

在select行为非常重要的情况下,这显然是行不通的。 但是,如果您要更改所选项目背景的颜色,使其对用户不可见,则只会使其混淆。 如果你的意图是改变一些其他的特征来表明该项目被选中,那么这个问题的其他一些答案可能仍然更相关。

这是标记应该看起来如何的骨架:

  <ScrollViewer> <ItemsControl> <ItemsControl.ItemTemplate> <DataTemplate> ... </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </ScrollViewer> 

你必须为这个项目select创build一个新的模板。

 <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <Border BorderThickness="{TemplateBinding Border.BorderThickness}" Padding="{TemplateBinding Control.Padding}" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" SnapsToDevicePixels="True"> <ContentPresenter Content="{TemplateBinding ContentControl.Content}" ContentTemplate="{TemplateBinding ContentControl.ContentTemplate}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" /> </Border> </ControlTemplate> </Setter.Value> </Setter> 
 <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/> </Style.Resources> 

这段代码对我来说就像一个魅力。 感谢原始的海报。