33

I have a really simple WPF ListBox with SelectionMode set to Multiple.

<ListBox SelectionMode="Multiple" /> 

When the ListBox loses focus it's really hard to tell what's been selected because the selection colour changes from blue to a light grey colour. What's the easiest way of changing this behaviour so that it stays blue?

I know it's probably something to do with the ListItem's style, but I can't find where.

Cheers.

Similar: WPF ListView Inactive Selection Color

1
  • Thanks for the Dupe Micah, but it's not exactly the same, since I'm talking about the ListBox not the ListView. Which is why I didn't find the dupe. Not saying the solution doesn't work for both though. Commented Mar 30, 2009 at 20:30

7 Answers 7

50

I have done something like this using the following in a merged ResourceDictionary, it may help you:

<Style TargetType="ListBoxItem"> <Style.Resources> <!--SelectedItem with focus--> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="LightBlue" Opacity=".4"/> <!--SelectedItem without focus--> <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey }" Color="LightBlue" Opacity=".4"/> </Style.Resources> </Style> 
Sign up to request clarification or add additional context in comments.

2 Comments

Use InactiveSelectionHighlightBrushKey instead of ControlBrushKey from .NET 4.5.
This does not seem to work for Windows-8 which uses static colors in the default ControlTemplate triggers. You'd have to derive the base Style and specify the over-ridden brushes in those triggers or give the colors directly. stackoverflow.com/questions/16819577/…
11

This is not an answer to the question, but I found this when I was looking for a way to disable selections in my listboxes. By using a slightly modified form of Guy's & bendewey's technique above, it turns out you can give the appearance of no selections in your listbox without replacing the underlying items control or anything like that. Here's the code I used:

<Grid.Resources> <Style TargetType="ListBoxItem"> <Style.Resources> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="White" /> <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" /> <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="White" /> </Style.Resources> </Style> </Grid.Resources> 

I also found the following MSDN page helpful:

MSDN: SystemColors Members (System.Windows)

Thanks for the help, guys.

Comments

7

A more complete solution would be to have the new brush refer to HighlightColor:

<Style TargetType="ListBox"> <Setter Property="ItemContainerStyle"> <Setter.Value> <Style TargetType="ListBoxItem"> <Style.Resources> <SolidColorBrush x:Key="{x:Static Member=SystemColors.InactiveSelectionHighlightBrushKey}" Color="{DynamicResource ResourceKey={x:Static Member=SystemColors.HighlightColorKey}}" /> </Style.Resources> </Style> </Setter.Value> </Setter> </Style> 

This would ensure that it uses the same color and matches the system theme (even if the system theme changes during runtime, thanks to DynamicResource).

By the way, it seems recent versions of WPF do not use "ControlBrush" for this anymore, but the more appropriate "InactiveSelectionHighlightBrush".

1 Comment

This does not seem to work on Windows 10, could you be able to verify if this should still work?
4

You can probably solve your problem by re-writing the Template, but try this for an easy patch.

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

Comments

1

When your selected items become grayed out it is because your control is losing its logical focus. Multiple controls have the ability to have logical focus at the same time. So a simple solution to this could be to give your ListBox a FocusScope via the FocusManager.

<ListBox SelectionMode="Multiple" FocusManager.IsFocusScope="True"></ListBox> 

1 Comment

It seems the other controls must get a focus scope for this control to remain focused.
0

I also have this problem. But I solved this by using IsSynchronizedWithCurrentItem="True":

<ListBox IsSynchronizedWithCurrentItem="True" /> 

Comments

0

I tried the style resource suggestions from multiple examples however nothing solved my problem of the List box selected item being grey highlight on return to the screen from a dialog window - The logical focus was the problem as referred to by 'Sachar' above. I solved the problem by setting [listboxname].SelectedIndex = -1; as the final line of code for the button click that opened the dialog window. No more gray background item.

1 Comment

It looks like this does not answer the question per se but rather is a comment on Sachar's answer.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.