WPF ListView неактивный цвет выделения
Я создаю приложение WPF, в котором несколько вариантов выбора ListView выполняются подряд (аналогично браузеру iTunes). Проблема в том, что по умолчанию неактивный цвет выделения слишком светлый. (смотреть ниже)

Как я могу изменить этот цвет, чтобы мой неактивный listview выглядел так? (смотреть ниже)

решение
переопределите SystemColor по умолчанию с помощью Style вот так:
<Style TargetType="ListViewItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{x:Static SystemColors.HighlightColor}"/>
</Style.Resources>
</Style>
6 ответов:
The
ListBoxшаблон использует системный цвет под названиемControlBrushдля установки неактивного цвета подсветки. Поэтому вы можете просто переопределить этот цвет:<ListBox> <ListBox.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}">Red</SolidColorBrush> </ListBox.Resources> </ListBox>
изменение
SystemColors.ControlBrushKeyне работает для меня, я должен был изменитьSystemColors.InactiveSelectionHighlightBrushKeyтак вместо:
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Red" />Я должен был использовать:
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Red"/>
ответ в некоторых случаях решит проблему, но не идеален, поскольку он ломается, когда элемент управления отключен/только для чтения, а также переопределяет цветовые схемы, а не использует их. Мое предложение-вместо этого добавить в теги ListBox следующее:
<ListBox....> <ListBox.Resources> <Style 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="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.Resources> </ListBox>что это будет делать, это установить цвет фона подсветки в элементе списка всякий раз, когда он выбран (независимо от состояния элемента управления).
мой ответ основан на помощи от ответа уже дано, вместе со следующим блогом:http://blogs.vbcity.com/xtab/archive/2009/06/29/9344.aspx
вы должны переопределить некоторые свойства SystemColors. Взгляните на класс SystemColors (MSDN). Есть больше свойств, чем InactiveSelectionHighlightBrushKey, например InactiveSelectionHighlightTextBrushkey, который влияет на цвет текста.
<Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="White"/> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Yellow"/> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}" Color="Blue"/> <Style TargetType="ListViewItem"> <Setter Property="FontSize" Value="20" /> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="Padding" Value="25,5" /> </Style> </Window.Resources> <StackPanel Orientation="Horizontal"> <ListView> <ListViewItem Content="Item" /> <ListViewItem Content="Item" /> </ListView> <ListView> <ListViewItem Content="Item" /> <ListViewItem Content="Item" /> </ListView> </StackPanel> </Window>
для меня это сделал трюк:
<ListBox HorizontalContentAlignment="Stretch"> <ListBox.ItemTemplate> <DataTemplate> <Label Margin="-5, -2,-5,-2" Content="{Binding Item}"> <Label.Style> <Style TargetType="Label"> <Style.Triggers> <MultiDataTrigger> <MultiDataTrigger.Conditions> <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox}},Path=IsFocused}" Value="False"/> <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True"/> </MultiDataTrigger.Conditions> <Setter Property="Background" Value="CornflowerBlue"/> </MultiDataTrigger> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="True"> <Setter Property="Foreground" Value="White"/> </DataTrigger> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBoxItem}},Path=IsSelected}" Value="False"> <Setter Property="Foreground" Value="Black"/> </DataTrigger> </Style.Triggers> </Style> </Label.Style> </Label> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
в старых .NET Framework переопределение системных цветов не работает. Решение, которое работает в .NET Framework 4.0 является здесь.
<ListView> <ListView.Resources> <Style TargetType="{x:Type ListViewItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type ListViewItem}"> <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> </Border> <ControlTemplate.Triggers> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Selector.IsSelectionActive" Value="False" /> <Condition Property="IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter Property="Background" TargetName="Bd" Value="DarkOrange" /> </MultiTrigger> <MultiTrigger> <MultiTrigger.Conditions> <Condition Property="Selector.IsSelectionActive" Value="True" /> <Condition Property="IsSelected" Value="True" /> </MultiTrigger.Conditions> <Setter Property="Background" TargetName="Bd" Value="OrangeRed" /> </MultiTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>работает как для ListBox, так и для ListView.

Comments