WPF ListView 不活动选择颜色
问题:WPF ListView Inactive Selection Color问题的出现原因是什么?解决方法是什么?
对于WPF中的ListBox模板,使用了一个名为ControlBrush的系统颜色来设置不活动时的高亮颜色。因此,可以通过覆盖该颜色来解决问题。代码如下:
Red
但是这种做法存在一些问题。首先,它不允许您对应用程序进行皮肤定制。其次,如果您更改Windows主题的系统颜色,它将恢复默认设置。有人对此提出了一些疑问,认为这种方法能否实现应用程序的皮肤定制,并测试了在运行测试工具的情况下更改主题是否有效。但是,实际情况是,使用这种资源覆盖的方式只会影响到使用该资源的ListBox。这是因为该资源是在ListBox级别上定义的,所以只会影响到该ListBox。实际上,您是在覆盖所有使用该资源的对象的样式键。
对于具有可视效果关闭的用户来说,这种做法是不好的,会导致许多问题。滚动条和按钮的颜色会改变为当前的高亮颜色。因此,滚动条和ListView的按钮变为蓝色,非常糟糕。因此,这种做法是不正确的。
在.NET 4.5中,他们改变了关键字,可以参考下面的答案。但是,这种做法是错误的,不建议使用。正确的做法请参考stackoverflow.com/questions/1462232/…。
总结起来,WPF ListView Inactive Selection Color问题的出现原因是使用了系统颜色ControlBrush作为不活动时的高亮颜色,并且无法实现应用程序的皮肤定制。解决方法是通过覆盖ControlBrush颜色来改变不活动时的高亮颜色。但是这种做法存在问题,不适用于有视觉效果关闭的用户。正确的解决方法可以参考上述链接。
WPF ListView Inactive Selection Color问题的原因是更改SystemColors.ControlBrushKey属性无法生效,而需要改变SystemColors.InactiveSelectionHighlightBrushKey属性。解决方法是将SolidColorBrush的x:Key值修改为SystemColors.InactiveSelectionHighlightBrushKey并设置Color属性值为所需的颜色。此外,还需要注意到在某些情况下,输入的颜色可能会被另一种颜色覆盖,导致看起来不完全一样。对于.NET 4和.NET 4.5版本,还需要考虑FrameworkCompatibilityPreferences.AreInactiveSelectionHighlightBrushKeysSupported字段,它会控制高亮颜色的使用。对于.NET 6版本,还需要使用SystemColors.InactiveSelectionHighlightTextBrushKey属性来设置文本的颜色。
问题出现的原因是在WPF中,当ListView处于非活动状态时,选择项的背景色无法正确显示。解决方法是通过在ListBox标签中添加一段代码,创建一个Style来设置ListBoxItem的模板,使得在选择项被选中时,背景色能够正确显示。
具体的解决方法如下所示:
这段代码中,我们通过设置ListBoxItem的模板,当选择项被选中时,将背景色设置为HighlightBrushKey对应的颜色,从而实现了选择项背景色的正确显示。
这个解决方法不仅能够解决问题,还能够在控件处于禁用/只读状态时正常工作,并且不会覆盖颜色方案,而是利用它们。这种方法能够根据控件状态来设置背景色,从而实现了选择项背景色的正确显示。
这个解决方法是基于之前给出的答案和博客的帮助而来,博客地址为:http://blogs.vbcity.com/xtab/archive/2009/06/29/9344.aspx。
需要注意的是,这种方法会将所有文本颜色设置为黑色(在我的系统上,高亮文本通常是白色,因为黑色在深蓝色上不易读取)。但是,可以通过创建一个正常的触发器,在IsSelected为true时将前景色设置为"HighlightTextBrushKey"来解决这个问题。这种方法能够做到OP所要求的效果,并且不会对其他颜色产生影响。
这种解决方法非常实用,因为它不会覆盖其他颜色,而且在控件禁用时也能正常工作。这个方法适用于WPF和.NET 4.6版本。需要注意的是,不能直接通过IsSelected触发器来直接覆盖Background属性,而是需要通过重写控件模板来实现。