将选定且未聚焦的列表框样式更改为不灰显

问题描述 投票:0回答:7

我有一个非常简单的 WPF ListBox,其 SelectionMode 设置为 Multiple。

<ListBox SelectionMode="Multiple" />

当列表框失去焦点时,很难判断选择了什么,因为选择颜色从蓝色变为浅灰色。改变这种行为使其保持蓝色的最简单方法是什么?

我知道这可能与 ListItem 的样式有关,但我找不到在哪里。

干杯。

类似: WPF ListView 非活动选择颜色

.net wpf listbox
7个回答
50
投票

我在合并的 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
投票

这不是问题的答案,但当我寻找一种禁用列表框中的选择的方法时,我发现了这一点。通过使用上面盖伊和本杜威技术的稍微修改形式,事实证明,您可以在列表框中显示没有选择的外观,而无需替换底层项目控件或类似的东西。这是我使用的代码:

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

更完整的解决方案是让新画笔参考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
投票

您可能可以通过重写模板来解决您的问题,但尝试这个简单的补丁。

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

当您选择的项目变灰时,这是因为您的控件失去了逻辑焦点。多个控件能够同时获得逻辑焦点。因此,一个简单的解决方案可能是通过 FocusManager 为您的 ListBox 提供 FocusScope。

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

0
投票

我也有这个问题。但我通过使用 IsSynchronizedWithCurrentItem="True" 解决了这个问题:

<ListBox 
IsSynchronizedWithCurrentItem="True" />

0
投票

我尝试了多个示例中的样式资源建议,但是没有解决我的问题:列表框所选项目在从对话框窗口返回屏幕时呈灰色突出显示 - 逻辑焦点是上面“Sachar”提到的问题。 我通过设置 [listboxname].SelectedIndex = -1; 解决了这个问题作为打开对话框窗口的按钮单击的最后一行代码。不再有灰色背景项目。

© www.soinside.com 2019 - 2024. All rights reserved.