【发布时间】:2016-12-27 17:17:35
【问题描述】:
-
背景:我们大多数人都知道 .NET Framework 提供的
SysListView32通用控件和等效的包装器ListView类。深入了解其内部结构表明,它提供的用于滚动其内容的滚动条不是控件本身,而是由SysListView32控件管理。 -
目标:始终绘制滚动条,即使它没有
ListViewItems可显示或只有很少的ListViewItems,以至于无论如何都不需要滚动条;有点像模仿RichTextBox类,其ScrollBars属性设置为ForcedBoth。或者有点像这样ListBox:
-
问题:
-
.NET 对于
ListView中的滚动条完全NO糖。 - Win32 文档没有说明何时显示/隐藏和/或启用/禁用滚动条。
-
.NET 对于
-
我的解决方法:
-
派生类中的
overrideWndProc并按照步骤 2 和 3 处理其WM_HSCROLL和WM_VSCROLL消息。 - 调用
base.WndProc对滚动功能进行实际需要的处理。 - 创建一个类似
WmScroll的方法并立即对其进行my 处理afterbase.WndProc已返回。 - 这包括对
GetScrollInfo的 p/invoke 调用。确定是否确实需要滚动条。如果不是,则使用所需的值调用ShowScrollBar和EnableScrollBar以绘制明显禁用的滚动条。
-
派生类中的
-
解决方法的问题:
- 它几乎没用。滚动条显示和禁用,但与 Windows 经典主题 下的滚动条类似。
- 它隐藏了每个
ListViewGroup的折叠按钮,使其无用!
描述性图片:
期待已久的实际问题:
我如何强制滚动条总是在 Visible 在一个 ListView 不管有多少个ListViewItems如果不需要就禁用它们,同时避免尺寸误算 (显示 ListViewGroups 的折叠按钮) 和主题恶化?
欢迎无代码回答,欢迎使用 C#、VB.NET 和 C++/CLR 中的代码回答。如果您以 .NET 支持的任何其他语言发布代码,还请留下一个代码转换网站的链接,如果代码看起来,呃,难以理解,我可能会使用。
【问题讨论】:
-
有一堆 ListView 相关的滚动条操作显示in this Q+A 包括一个 Pinvoke 到
ShowScrollBar -
@Plutonix 不错的链接,但我不想根据是否出现滚动条来调整列的大小。我也不想隐藏滚动条。我只希望他们在
ListView的整个生命周期中都存在。 -
鉴于系统似乎不想这样做,并且列表视图以其标准形式完美运行,我想知道您的动机是什么。
-
@DavidHeffernan 除了看起来很酷之外,主要是学习——如果其他常见控件支持这一点,为什么不支持这个。我也喜欢在测试对象上做实验(在这种情况下是
ListView),直到我碰壁说“这不可能!”或“这是邪恶的!”。 ;) 在这两种情况下,我只想知道为什么我不应该做一些我可能会尝试做的事情。 -
@DavidHeffernan 在这种情况下的动机:我不希望我的
ListView显示部分项目。启用水平滚动后,如果我相应地设置大小,则会显示整数个项目。这仅适用于显示的滚动条,或不显示但不能同时显示的滚动条(默认情况下根据需要显示它们)。我不想禁用水平滚动,也不能动态更改ListView的大小(这太尴尬了。)所以,这是我唯一的选择:根据需要禁用和启用滚动条让它们在ListView的整个生命周期中可见。
标签: c# winforms listview pinvoke scrollbars