31

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

Community
  • 1
  • 1
Ray
  • 45,695
  • 27
  • 126
  • 169
  • 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 Mar 30 '09 at 20:30

6 Answers6

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>
citykid
  • 9,916
  • 10
  • 55
  • 91
Guy Starbuck
  • 21,603
  • 7
  • 53
  • 64
  • 18
    Use InactiveSelectionHighlightBrushKey instead of ControlBrushKey from .NET 4.5. – Mike Fuchs May 21 '13 at 15:41
  • 6
    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. http://stackoverflow.com/questions/16819577/setting-background-color-or-wpf-4-0-listbox/16820062#16820062 – Viv May 29 '13 at 17:31
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.

Eben Geer
  • 3,696
  • 3
  • 31
  • 34
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".

nmclean
  • 7,564
  • 2
  • 28
  • 37
  • 2
    This does not seem to work on Windows 10, could you be able to verify if this should still work? – skiwi Dec 29 '16 at 13:22
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>
bendewey
  • 39,709
  • 13
  • 100
  • 125
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>
Sachar
  • 13
  • 4
  • 1
    It seems the _other_ controls must get a focus scope for _this_ control to remain focused. – Peter Oct 27 '20 at 10:12
0

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

<ListBox 
IsSynchronizedWithCurrentItem="True" />
ncfuncion
  • 227
  • 1
  • 3
  • 11