31
votes

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

6
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.Ray

6 Answers

50
votes

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

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.

7
votes

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

4
votes

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

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

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

<ListBox 
IsSynchronizedWithCurrentItem="True" />