Ray
Ray

Reputation: 46595

Change selected and unfocused Listbox style to not be grayed out

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

Upvotes: 33

Views: 28002

Answers (7)

user3763081
user3763081

Reputation: 43

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.

Upvotes: 0

Sachar
Sachar

Reputation: 13

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>

Upvotes: 1

Guy Starbuck
Guy Starbuck

Reputation: 21873

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>

Upvotes: 50

ncfuncion
ncfuncion

Reputation: 227

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

<ListBox 
IsSynchronizedWithCurrentItem="True" />

Upvotes: 0

nmclean
nmclean

Reputation: 7734

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

Upvotes: 7

Eben Geer
Eben Geer

Reputation: 3796

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.

Upvotes: 11

bendewey
bendewey

Reputation: 40265

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>

Upvotes: 4

Related Questions