到目前为止,这是我的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>
唯一的问题是所选项目右侧有一个蓝色框。我假设有一种方法可以改变选择颜色,但我找不到它。
答案 0 :(得分:70)
<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)
答案 1 :(得分:50)
或者您可以将HighlightBrushKey直接应用于ListBox。 Setter Property =“Background”Value =“Transparent”不起作用。但我确实必须将前景设置为黑色。
<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>
答案 2 :(得分:45)
您需要使用ListBox.ItemContainerStyle。
ListBox.ItemTemplate指定应如何显示项目的内容。但WPF仍会将每个项目包装在ListBoxItem控件中,默认情况下,如果选中它,则将其Background设置为系统突出显示颜色。你无法阻止WPF创建ListBoxItem控件,但你可以设置样式 - 在你的情况下,将背景设置为始终是透明或黑色或其他 - 并且这样做,你使用ItemContainerStyle。
juFo's answer通过在项目样式的上下文中“劫持”系统背景画笔资源,显示了一种可能的实现方式;另一种,也许更惯用的技术是使用Setter
作为Background属性。
答案 3 :(得分:29)
我必须设置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>
希望这可以帮助别人。
答案 4 :(得分:8)
如果选择不重要,最好使用ScrollViewer中包含的ItemsControl。这个组合比Listbox(实际上已经从ItemsControl派生)更轻量级,并且使用它将消除使用廉价的黑客来覆盖ItemsControl中已经不存在的行为的需要。
如果选择行为实际上很重要,那么这显然不起作用。但是,如果要更改“所选项目背景”的颜色,使其对用户不可见,那么这只会使它们混淆。如果您打算更改某些其他特征以表明该项目已被选中,那么此问题的其他一些答案可能仍然更具相关性。
以下是标记应如何显示的框架:
<ScrollViewer>
<ItemsControl>
<ItemsControl.ItemTemplate>
<DataTemplate>
...
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
答案 5 :(得分:8)
你必须像这样为项目选择创建一个新模板。
<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>
答案 6 :(得分:5)
我尝试了各种解决方案,但没有一个对我有用。经过更多研究,我在这里找到了一个对我有用的解决方案
https://gist.github.com/LGM-AdrianHum/c8cb125bc493c1ccac99b4098c7eeb60
<Style x:Key="_ListBoxItemStyle" TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="_Border"
Padding="2"
SnapsToDevicePixels="true">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="_Border" Property="Background" Value="Yellow"/>
<Setter Property="Foreground" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<ListBox ItemContainerStyle="{DynamicResource _ListBoxItemStyle}"
Width="200" Height="250"
ScrollViewer.VerticalScrollBarVisibility="Auto"
ScrollViewer.HorizontalScrollBarVisibility="Auto">
<ListBoxItem>Hello</ListBoxItem>
<ListBoxItem>Hi</ListBoxItem>
</ListBox>
我将其发布在这里,因为这是该问题的第一个Google搜索结果,因此其他人可能会发现它很有用。