更改WPF列表框中SelectedItem的背景

更改WPF列表框中SelectedItem的背景,wpf,xaml,Wpf,Xaml,这个问题在这里已经被问了十几次了,但是给出的答案似乎都不起作用。问题:在WPF列表框中,如何更改(所选项目和/或“鼠标悬停”项目的)突出显示颜色 这不起作用(per)-高亮显示仍为默认值: <StackPanel> <StackPanel.Resources> <Style x:Key="ListBoxSelectedItemsStyle" TargetType="{x:Type ListBoxItem}&quo

这个问题在这里已经被问了十几次了,但是给出的答案似乎都不起作用。问题:在WPF列表框中,如何更改(所选项目和/或“鼠标悬停”项目的)突出显示颜色

这不起作用(per)-高亮显示仍为默认值:

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="ListBoxSelectedItemsStyle" TargetType="{x:Type ListBoxItem}">
            <Style.Resources>
                <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Black" />
            </Style.Resources>
        </Style>
    </StackPanel.Resources>
    <ListBox ItemContainerStyle="{StaticResource ListBoxSelectedItemsStyle}">
        <ListBoxItem>Item1</ListBoxItem>
        <ListBoxItem>Item2</ListBoxItem>
        <ListBoxItem>Item3</ListBoxItem>
    </ListBox>
</StackPanel>

项目1
项目2
项目3
这也不起作用(轻微变化,根据):


项目1
项目2
项目3
这也不起作用(根据):


项目1
项目2
项目3

许多答案都包含了这方面的一些变化(例如,等等)——但无论我使用哪种答案,都不会有任何变化。突出显示不受影响。

您尝试的所有三个版本基本上都是相同的:它们提供了一个新资源,使用默认的
ListBoxItem
控件模板使用的相同键。理论上,通过提供具有相同键的新资源项,当框架需要查找适当的资源时,它将遍历已加载的资源字典,首先查找您的资源字典,并使用它,而不是默认情况下使用的原始资源字典

但似乎有两个问题:

  • 首先,自提供这些引用后,所使用的密钥发生了更改。当我查看当前的
    ListBoxItem
    样式时,它使用常规字符串作为键,而不是
    SystemColors
    类中的这些属性。当前键名为
    “Item.SelectedActive.Background”
    ,用于在选中项目并具有焦点时设置背景
  • 其次,即使使用新密钥,我也无法找到并使用资源项。原始默认笔刷仍在使用,尽管理论是正确的
也许还有办法让它继续发挥作用。但要想弄清楚这一点需要时间,在调试器中单步执行代码,并观察WPF在初始化控件和触发触发器时所做的操作。这样的调查可能有助于了解WPF是如何查找资源的,以及如何设法找到具有相同密钥的您自己的资源

但目前,我没有时间做这些。我知道如何通过蛮力使它工作。XAML工具箱中最大的难题之一是XAML设计器中的“编辑模板”命令。为此,您需要创建
ListBoxItem
模板的副本,以便使用该模板的编辑版本。在XAML编辑器的设计模式中右键单击
列表框
,然后转到此菜单:

选择“编辑副本…”菜单项

这将向文件中添加新资源,如下所示:


它还将更新XAML中的
列表框
,以引用项目容器模板的样式。此时,您可以根据自己的心意编辑资源。例如,更改
“Item.SelectedActive.Background”
键的画笔:


鉴于WPF文档确实讨论了资源层次结构以及如何按键查找资源,因此似乎应该可以在不完全覆盖项容器样式的情况下实现这一点。但我现在看不出有什么办法

就其价值而言,上述内容基本上是在中提出的,减去该问题中发现的所有额外细节。从某种意义上说,这个问题可以被认为是这个问题的重复

如果这是你经常遇到的问题,并且想要一个不那么麻烦的解决方案,那么你可能会发现还有一些其他问题与此相关。特别是,您可以使用标记扩展自定义样式的处理方式,从而允许您在编译时处理资源字典时合并或以其他方式操作它们。这是一种复杂得多的方法,但如果在您的项目中经常出现这种方法,那么它可能是值得的。例如,见:
你的问题实际上不是这两个问题的重复,但基本技巧无论如何都可以应用于你的情况。

这个怎么样?有趣。这更近了——我确实看到了黄色背景——但它会破坏项目的其他方面(即,现在它们居中而不是左对齐,它们不会填满宽度,等等)。因此,它似乎改变了很多,不仅仅是背景。对我来说不是……默认情况下,突出显示和可点击区域占据了列表框的整个宽度。这样,它只会在文本本身的正上方高亮显示,您只能在文本上单击鼠标右键,从而使单击区域大大缩小&项目的功能行为是非标准的。这不是为你做的吗?如前所述,如果不清楚,我可以发布对比截图……对我来说很好。当然,只有ItemContainerStyle,而不是XAML的其余部分。完美的答案,谢谢!!令人难以置信的是,尽管微软自己完全打破了过去的工作方式,从而使99%的答案无效,但这显然是令人沮丧的
<StackPanel>
    <ListBox>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Style.Resources>
                    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Yellow"/>
                </Style.Resources>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBoxItem>Item1</ListBoxItem>
        <ListBoxItem>Item2</ListBoxItem>
        <ListBoxItem>Item3</ListBoxItem>
    </ListBox>
</StackPanel>
<StackPanel>
    <ListBox>
        <ListBox.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Black"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Black"/>
            <Style TargetType="{x:Type ListBoxItem}">
                <Style.Triggers>
                    <Trigger Property="IsSelected" Value="True">
                        <Setter Property="Background" Value="Black"/>
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ListBox.Resources>
        <ListBoxItem>Item1</ListBoxItem>
        <ListBoxItem>Item2</ListBoxItem>
        <ListBoxItem>Item3</ListBoxItem>
    </ListBox>
</StackPanel>