背景:我们大多数人都知道 .NET Framework提供的SysListView32
公共控件和等效包装器ListView
类。它内部的一点深度表明它滚动内容的滚动条是 NOT 控制自己,但是由{{{ 1}}控制。
目标:总是绘制滚动条,即使它没有显示SysListView32
,也很少,因此无论如何都不需要滚动条;有点像模仿ListViewItems
类,其RichTextBox
属性设置为ScrollBars
。或者有点像ForcedBoth
:
问题:
ListBox
内的滚动条完全 NO sugar 。< / LI>
我的解决方法:
ListView
派生类中的override
,并根据步骤2和3处理其WndProc
和WM_HSCROLL
条消息。WM_VSCROLL
执行滚动功能的实际处理。base.WndProc
WmScroll
创建after
之类的方法并对其执行我的处理。base.WndProc
的p / invoke调用。确定是否确实需要滚动条。如果不是,请使用所需值调用GetScrollInfo
和ShowScrollBar
来绘制明显禁用的滚动条。解决方法问题:
EnableScrollBar
的折叠按钮,使它们无用!描述性图片:
期待已久的实际问题 :
如何在 {{1>中强制滚动条总是 ListViewGroup
无论 Visible
的数量如何,如果不必要,则禁用它们,同时避免大小错误估算 (显示 ListView
s) 的折叠按钮和主题恶化?
欢迎使用无代码的答案,以及 C#, VB.NET 和 C ++ / CLR 中的代码答案。如果您使用.NET支持的任何其他语言发布代码,请提供指向代码转换网站的链接,如果代码看起来很难理解,我可能会使用该代码转换网站。
答案 0 :(得分:0)
<强>信息强>:
ListView
在其样式中没有WS_HSCROLL | WS_VSCROLL
个标志。
Control
的没有设置这些标记的滚动条。CreateParams
也不起作用。您必须使用OnHandleCreated
。{/ li>在SetWindowLong
方法中手动设置
ShowScrollBar
会强制设置这些标志。解决方案:
定义您的WndProc
,如下所示:
protected override void WndPoc(ref Message m) { //custom code before calling base.WndProc base.WndProc(ref m); //custom after base.WndProc returns WmScroll(); //VERY INEFFICIENT, called for each message :( }
按如下方式定义WmScroll():
protected virtual void WmScroll() { NativeMethods.ShowScrollBar(Handle, SB_BOTH, true); //si.fMask = SIF_PAGE | SIF_RANGE <- initialized in .ctor NativeMethods.GetScrollInfo(Handle, SB_HORZ, ref si); if(si.nMax < si.nPage) NativeMethods.EnableScrollBar(Handle, SB_HORZ, ESB_DISABLE_BOTH); else NativeMethods.EnableScrollBar(Handle, SB_HORZ, ESB_ENABLE_BOTH); NativeMethods.GetScrollInfo(Handle, SB_VERT, ref si); if(si.nMax < si.nPage) NativeMethods.EnableScrollBar(Handle, SB_VERT, ESB_DISABLE_BOTH); else NativeMethods.EnableScrollBar(Handle, SB_VERT, ESB_ENABLE_BOTH); }
现在,看起来像:
这些是添加了另一个项目,其中包含水平滚动和工作ListViewGroup
折叠按钮:
AutoResizeColumns
,否则垂直滚动条会隐藏折叠按钮。