【问题标题】:Change selected and unfocused Listbox style to not be grayed out将选定和未聚焦的列表框样式更改为不灰显
【发布时间】:2009-03-30 20:08:23
【问题描述】:

我有一个非常简单的 WPF 列表框,其中 SelectionMode 设置为 Multiple。

<ListBox SelectionMode="Multiple" />

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

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

干杯。

类似: WPF ListView Inactive Selection Color

【问题讨论】:

  • 感谢 Dupe Micah,但并不完全相同,因为我说的是 ListBox 而不是 ListView。这就是为什么我没有找到骗子。并不是说解决方案对两者都不起作用。

标签: .net wpf listbox


【解决方案1】:

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

【讨论】:

  • 使用 InactiveSelectionHighlightBrushKey 而不是 .NET 4.5 中的 ControlBrushKey。
  • 这似乎不适用于在默认 ControlTemplate 触发器中使用静态颜色的 Windows-8。您必须派生基础 Style 并在这些触发器中指定覆盖的画笔或直接提供颜色。 stackoverflow.com/questions/16819577/…
【解决方案2】:

这不是问题的答案,但我在寻找一种方法来禁用列表框中的选择时发现了这一点。通过使用上述 Guy's & 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)

谢谢你们的帮助,伙计们。

【讨论】:

    【解决方案3】:

    更完整的解决方案是让新画笔引用 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”。

    【讨论】:

    • 这似乎不适用于 Windows 10,您能否验证这是否仍然有效?
    【解决方案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>
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 看来 other 控件必须获得焦点范围,this 控件才能保持焦点。
      【解决方案6】:

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

      <ListBox 
      IsSynchronizedWithCurrentItem="True" />
      

      【讨论】:

        猜你喜欢
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-11
        • 1970-01-01
        • 2012-10-11
        • 2011-03-31
        相关资源
        最近更新 更多