【发布时间】:2011-05-22 18:33:55
【问题描述】:
在 Windows 窗体应用程序中,是否可以更改 ListView 控件的滚动条颜色?
请让我知道我需要什么属性或代码来实现这一点,我找不到也无法开发类似的东西。
我的目的是将主题应用于我的整个 WinForms 应用程序。
【问题讨论】:
标签: c# .net winforms listview scrollbar
在 Windows 窗体应用程序中,是否可以更改 ListView 控件的滚动条颜色?
请让我知道我需要什么属性或代码来实现这一点,我找不到也无法开发类似的东西。
我的目的是将主题应用于我的整个 WinForms 应用程序。
【问题讨论】:
标签: c# .net winforms listview scrollbar
简短的回答:不,不可能。
更长(更准确)的答案:
不幸的是,这远没有设置属性那么简单。原因是ListView 控件使用的滚动条并不是真正的滚动条控件。它们没有自己的窗口句柄,它们的绘图完全由ListView 控件在内部管理。当然,WinForms 中的ListView 控件只是Win32 API 提供的相同控件的薄包装。它们都没有公开任何更改滚动条颜色的工具。
但情节变厚了。我说过ListView 控件(注意这也适用于TreeView)处理绘制滚动条本身,这应该表明你不能简单地处理它的Paint 事件并像你一样自己绘制它们许多其他 WinForms 控件。 Paint 事件对应于窗口消息WM_PAINT,但是当窗口需要绘制非客户区时,还有另一条消息(WM_NCPAINT)发送到窗口。当收到WM_NCPAINT 消息时,滚动条是按理说的,因为我说过它们是ListView 控件框架的一部分。但他们不是。
然后是毫无意义的过度定制问题。我强烈支持尊重用户当前主题设置的应用程序。如果我将 Windows 配置为使用高对比度主题(或者如果我无法忍受蓝色,所以我有一个绿色主题),我希望我计算机上的应用程序使用该主题绘制它们的 UI 元素。无论您将滚动条设计成什么样子,无论它在您的计算机上看起来多么棒,都保证在某人的计算机上看起来像垃圾。如果该人是您的用户之一,哎呀。少数使用自定义主题的应用程序进行了大量测试,但仍然无法避免遇到问题。
您可能能够以某种方式自行挂钩滚动条,但这很可能是不可能的,因为它们部分是在内核模式下实现的。事实上,我听说WindowBlinds 的作者声称挂钩滚动条是他们必须做的最困难的事情。他们当然不会分享他们的任何技巧。
唯一看起来很有希望的是 James Brown 的 Custom Scrollbar Library,但它是用 C 编写的。您自己将其移植到 C#。和往常一样,这种事情不会没有问题。阅读 cmets 显示不少人有各种问题。如果您不太了解 Win32 API,您可能无法修复这可能会引入您的应用程序的任何错误。
对此主题的 Google 搜索几乎完全发现未回答的问题是有原因的。对于它的价值,这在 WPF 中方式更容易。
【讨论】: