【问题标题】:WinForms: How to avoid horizontal scroll bar with AutoScroll?WinForms:如何使用 AutoScroll 避免水平滚动条?
【发布时间】:2011-03-04 18:50:05
【问题描述】:

我正在编写一个自定义控件,其中包含一个项目列表(子控件),这些项目可以水平调整大小以适应控件的宽度。如果有很多项目(或者控件被调整大小以至于它垂直不够高),那么垂直滚动条是必要的;但是当出现垂直滚动条时,子控件突然太宽,导致出现水平滚动条。

鉴于我正在手动控制控件放置(不依赖于AnchorStyles),什么是确保在不需要时不会出现水平滚动条的正确方法? (注意:我无法手动控制 VScroll 属性,因为我使用的是 Compact Framework;如果项目的最小宽度大于客户区域,则合法地需要水平滚动条。)

【问题讨论】:

    标签: c# .net winforms compact-framework autoscroll


    【解决方案1】:

    我在类似情况下所做的是,每次向列表中添加项目后,我都会检测滚动条是否可见并手动调整宽度。

    我检测滚动条是否显示的方法是:

    1. WS_VSCROLL 的测试已通过 P/Invoke 通过GetWindowLong() 在控件上设置。
    2. 扫描控件的子控件以获取垂直滚动条控件。

    这取决于控件如何处理滚动条,哪个是正确的。

    这也是在 Windows 上,而不是在 CF 中,所以我不确定这是否会以完全相同的方式工作。

    【讨论】:

    • 事实证明,对于我想做的事情(类似 iPhone 的 FlickList),Compact Framework 上的滚动太慢了,所以我不再需要答案。相反,我必须自己绘制控件以获得足够的性能。不过,我想知道滚动条是在什么时候出现的?我们必须处理在滚动条出现后立即发生的事件,以正确检测它的存在。一个单独的问题:等待滚动条出现会导致“闪烁”,因为控件将被重绘两次,但这对我来说(已经)没问题。
    【解决方案2】:

    在计算子控件所需的宽度时考虑垂直滚动条的宽度:

    System.Windows.Forms.SystemInformation.VerticalScrollBarWidth
    

    【讨论】:

    • 啊,但是如果还没有滚动条,那我真的不想考虑它。只有在计算了子控件的布局之后,或者在 Resize 事件创建了一个之后,才能检测到对垂直滚动条的需求。
    猜你喜欢
    • 1970-01-01
    • 2014-11-05
    • 2017-03-31
    • 1970-01-01
    • 2020-08-11
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多