在WinForms中更改ListView中滚动条的颜色

ql3eal8s  于 2022-11-17  发布在  其他
关注(0)|答案(2)|浏览(194)

在Windows Form应用程序中,是否可以变更ListView控件中卷轴的色彩?
请让我知道什么属性或代码,我需要实现这一点,我不能找到,也不能开发这样的东西。
我的目的是将一个主题应用于整个WinForms应用程序。

qjp7pelc

qjp7pelc1#

**简短的回答:**不,这是不可能的。
更长(更准确)的答案:

不幸的是,这远没有设置一个属性那么简单。原因是ListView控件使用的滚动条并不是真正的滚动条控件。它们没有自己的窗口句柄,它们的绘制完全由ListView控件内部管理。当然,WinForms中ListView控件只是Win32 API提供的同一控件的一个较薄的 Package 器,它们都没有公开任何用于更改滚动条颜色的工具。
但是情节变得复杂了。我说过ListView控件(请注意,这也适用于TreeView)处理滚动条的绘制,这表明您不能像处理许多其他WinForms控件那样简单地处理其Paint事件并自己绘制滚动条。Paint事件对应于窗口消息WM_PAINT,但是当窗口的非工作区需要被绘制时,会有另一条消息(WM_NCPAINT)被发送到窗口。当收到WM_NCPAINT消息时,滚动条被绘制是理所当然的,因为我说过它们是ListView控件框架的一部分。
然后是毫无意义的过度定制的问题。我强烈主张应用程序尊重用户当前的主题设置。如果我将Windows配置为使用高对比度主题(或者如果我只是无法忍受蓝色,所以我用绿色主题代替),我希望计算机上的应用程序使用该主题绘制UI元素。不管它在你的电脑上看起来有多棒,它在某人的电脑上肯定看起来像垃圾。如果那个人是你的用户之一,哎呀。少数使用自定义主题的应用程序做了大量的测试,但这仍然不能阻止他们遇到问题。
你 * 也许 * 能够以某种方式钩住滚动条本身,但这是不可能的,因为它们部分是在内核模式中实现的。事实上,我听说WindowBlinds的作者声称钩住滚动条是他们必须做的最困难的事情。他们当然不会分享他们的任何技巧。
唯一看起来有希望的是James Brown的Custom Scrollbar Library,但是它是用C编写的。你只能自己把它移植到C#。像往常一样,这类东西不会没有问题。阅读评论会发现很多人有各种各样的问题。如果你不太了解Win32 API,您可能无法修复可能引入到应用程序中的任何bug。
在谷歌上搜索这个主题几乎只会发现未回答的问题,这是有原因的。不管怎么说,这在WPF中要容易得多。

h22fl7wq

h22fl7wq2#

我针对这个问题的解决方法是建立支援自订色彩和主题的自订ScrollBar控件https://stackoverflow.com/a/73613059/5514131,然后在我们的控件内部建立自订ScrollBar,并在控件属性和事件的协助下,将自订ScrollBar系结至控件,并将主题放在预设控件ScrollBar的上方,以完全涵盖它们。
我知道这不是最好的方法,但它应该工作,以防止默认丑陋的滚动条破坏我的黑暗模式。
请参阅我对Panel控件的完整回答,不过,此解决方案也可应用于其他控件。https://stackoverflow.com/a/73613569/5514131

相关问题