Cod*_*ray 15
简短的回答:不,这是不可能的.
更长(更准确)的答案:
不幸的是,这远不如设置属性那么简单.原因是ListView控件使用的滚动条不是实际的滚动条控件.它们没有自己的窗口句柄,它们的绘图由ListView控件完全内部管理.当然,ListViewWinForms中的控件只是Win32 API提供的相同控件的一个薄包装器.它们都没有暴露任何改变滚动条颜色的工具.
但情节变浓了.我说ListView控件(注意这也适用于TreeView)处理滚动条本身,这应该表明你不能简单地处理它的Paint事件并像许多其他WinForms控件那样自己绘制它们.该Paint事件对应于窗口消息WM_PAINT,但是WM_NCPAINT当需要绘制非客户区域时,还有另一个消息()被发送到窗口.按理说滚动条在WM_NCPAINT收到消息时被绘制,因为我说它们是ListView控件框架的一部分.但他们不是.
然后是无意义的过度定制问题.我非常支持尊重用户当前主题设置的应用程序.如果我将Windows配置为使用高对比度主题(或者如果我不能忍受蓝色,那么我有一个绿色主题),我希望我的计算机上的应用程序使用该主题绘制他们的UI元素.无论你设计的滚动条看起来像什么,无论它在你的计算机上看起来多么棒,它都可以保证在某人的计算机上看起来像垃圾.如果那个人是你的一个用户,那就是oops.少数使用自定义主题的应用程序会进行大量测试,但仍然无法避免遇到问题.
你可能能够以某种方式钩住滚动条本身,但这很可能是不可能的,因为它们部分在内核模式下实现.事实上,我听说WindowBlinds的作者声称挂钩滚动条是他们不得不做的最困难的事情.他们肯定不会分享他们的任何技巧.
真正看起来很有希望的是James Brown的自定义滚动条库,但它是用C语言编写的.你可以自己移植到C#.像往常一样,这种事情不会没有它的问题.阅读评论显示了不少有各种问题的人.如果您不太了解Win32 API,那么您可能无法修复可能在您的应用程序中引入的任何错误.
谷歌搜索这个主题几乎完全揭示了未回答的问题.对于它的价值,这是方式在WPF容易.