Измените выбранный и не сфокусированный стиль списка, чтобы он не отображался серым цветом - PullRequest
31 голосов
/ 31 марта 2009

У меня действительно простой WPF ListBox с SelectionMode, установленным в Multiple.

<ListBox SelectionMode="Multiple" />

Когда ListBox теряет фокус, очень сложно сказать, что было выбрано, потому что цвет выделения меняется с голубого на светло-серый. Какой самый простой способ изменить это поведение, чтобы оно оставалось синим?

Я знаю, что это, вероятно, связано со стилем ListItem, но я не могу найти где.

Приветствие.

Аналогично: WPF ListView Неактивный цвет выделения

Ответы [ 6 ]

50 голосов
/ 31 марта 2009

Я сделал что-то подобное, используя следующее в объединенном ResourceDictionary, это может помочь вам:

<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 голосов
/ 28 августа 2009

Это не ответ на вопрос, но я нашел это, когда искал способ отключить выборки в списках. Используя слегка измененную форму техники Гая и Бендевея, описанной выше, оказывается, что вы можете создать видимость отсутствия выбора в вашем списке без замены элемента управления базовых элементов или чего-либо подобного. Вот код, который я использовал:

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

Я также нашел следующую страницу MSDN полезной:

MSDN: члены SystemColors (System.Windows)

Спасибо за помощь, ребята.

7 голосов
/ 04 октября 2013

Более полное решение будет иметь новую кисть, ссылающуюся на 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>

Это гарантирует, что он использует тот же цвет и соответствует системной теме (даже если системная тема изменяется во время выполнения, благодаря DynamicResource).

Кстати, последние версии WPF, похоже, больше не используют «ControlBrush» для этого, но более уместно «InactiveSelectionHighlightBrush».

4 голосов
/ 31 марта 2009

Вероятно, вы можете решить свою проблему, переписав Шаблон, но попробуйте это для простого патча.

<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>
0 голосов
/ 25 октября 2017

Когда выбранные вами элементы становятся серыми, это происходит потому, что ваш элемент управления теряет свой логический фокус. Несколько элементов управления могут одновременно иметь логическую направленность. Таким простым решением может быть предоставление ListBox FocusScope через FocusManager.

<ListBox SelectionMode="Multiple" FocusManager.IsFocusScope="True"></ListBox>
0 голосов
/ 21 ноября 2013

У меня тоже есть эта проблема. Но я решил это, используя IsSynchronizedWithCurrentItem = "True":

<ListBox 
IsSynchronizedWithCurrentItem="True" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...