WPF Listview Inaktive Auswahl Farbe
Frage
Ich erstelle eine WPF-Anwendung, bei der mehrere Listview-Auswahlen in einer Reihe (ähnlich den iTunes-Browser) vorgenommen werden. Das Problem ist, dass die Standard-inaktive Auswahl der Farbe zu hell ist. (siehe unten)
Wie kann ich diese Farbe ändern, so meine inaktive Listenansicht wie folgt aussieht? (siehe unten)
Lösung
Überschreiben Sie die Standardsystemcolor mit einem Style
etwa so:
<Style TargetType="ListViewItem">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{x:Static SystemColors.HighlightColor}"/>
</Style.Resources>
</Style>
Lösung
Die ListBox
Vorlage verwendet eine Systemfarbe genannt ControlBrush
die inaktive Highlight-Farbe einzustellen. Daher können Sie nur diese Farbe überschreiben:
<ListBox>
<ListBox.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}">Red</SolidColorBrush>
</ListBox.Resources>
</ListBox>
Andere Tipps
Ändern SystemColors.ControlBrushKey
nicht für mich arbeiten, musste ich ändern
SystemColors.InactiveSelectionHighlightBrushKey
Also statt:
<SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Red" />
Ich hatte zu verwenden:
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Red"/>
Die Antwort wird das Problem in einigen Fällen lösen, ist aber nicht ideal, da es bricht, wenn das Steuerelement deaktiviert / Read-only ist und es überschreibt auch die Farbschemata, anstatt den Vorteil von ihnen. Mein Vorschlag ist, die folgende in den List-Box-Tags hinzufügen:
<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>
Was wird dies tun, um die Highlight-Hintergrundfarbe auf dem Listenfeld Artikel gesetzt wird, wenn es (unabhängig von dem Steuerzustand) ausgewählt ist.
Meine Antwort basiert auf Hilfe aus der Antwort bereits gegeben, zusammen mit dem folgenden Blog: http://blogs.vbcity.com/xtab/archive/2009/06/29/9344.aspx
Sie haben einige Eigenschaften von Systemcolors außer Kraft zu setzen. Schauen Sie sich auf Systemcolors-Klasse ( MSDN) . Es gibt mehr Eigenschaften als InactiveSelectionHighlightBrushKey, z.B. InactiveSelectionHighlightTextBrushKey denen wirkt sich auf die Farbe des Textes.
<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>
Bei älter .NET Frameworks übergeordneten Systemfarben Arbeit does. Lösung, die in .NET Framework 4.0 funktioniert ist hier .
<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>
Funktioniert sowohl für ListBox und Listview.
Basierend auf diese andere Antwort hat ich die folgenden die aktiven und inaktive Farben das gleiche zu machen, ohne den tatsächlichen Wert zu :
<ListBox.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}"
Color="{x:Static SystemColors.HighlightColor}"/>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightTextBrushKey}"
Color="{x:Static SystemColors.HighlightTextColor}"/>
</ListBox.Resources>
Mit den gleichen Farben für aktive und inaktiven möglicherweise nicht ideal , aber die Standard-Farben waren so schwach, es war schwer zu sagen, welches Element ausgewählt wurde, wenn es inaktiv ist; Dies ist eine deutliche Verbesserung.
Für mich dieser hat den Trick:
<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>