更改所选和未聚焦的列表框样式,使其不变灰。

31

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

<ListBox SelectionMode="Multiple" />

当ListBox失去焦点时,很难确定已选择的内容,因为选定的颜色从蓝色变为浅灰色。最简单的改变这种行为的方法是什么,使其保持蓝色?
我知道这可能与ListItem的样式有关,但我找不到在哪里。
谢谢。
类似问题: WPF ListView Inactive Selection Color

感谢Dupe Micah,但它并不完全相同,因为我说的是ListBox而不是ListView。这就是为什么我没有找到重复项的原因。虽然并不是说这个解决方案对两者都不起作用。 - Ray
6个回答

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>

18
从 .NET 4.5 开始,请使用 InactiveSelectionHighlightBrushKey 替代 ControlBrushKey。 - Mike Fuchs
6
这似乎不适用于使用默认“ControlTemplate”触发器中静态颜色的Windows-8。您需要派生基本样式并在这些触发器中指定覆盖的画刷或直接给出颜色。https://dev59.com/SGQn5IYBdhLWcg3wcm57#16820062 - Viv

11

这不是对问题的回答,但当我在寻找一种禁用列表框中选择的方法时,我发现了这个。通过使用Guy和bendewey上面稍微修改过的技术,你可以在不替换底层项控件或类似的任何内容的情况下,给出列表框中没有选定项的外观。以下是我使用的代码:

<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 Members (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"。

2
这似乎在Windows 10上无法工作,您能否验证一下是否仍然有效? - skiwi

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>

1
似乎其他控件必须获得焦点范围,以使此控件保持聚焦。 - Peter

0

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

<ListBox 
IsSynchronizedWithCurrentItem="True" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接