【问题标题】:Vertical & Horizontal scrollbars in a panel面板中的垂直和水平滚动条
【发布时间】:2013-10-13 04:57:12
【问题描述】:

场景:

  • 在表单上放置一个面板。
  • 将面板的 BorderStyle 设置为 FixedSingle。 (只是为了让您在运行时可以看到它。)
  • 设置面板的 AutoScroll=True
  • 将面板的锚点设置为上、左、下、右
  • 在面板内,放置任何大小合适的控件(按钮、图片框或其他)。
  • 将控件的底部边缘调整为仅比面板底部高出几个像素。
  • 调整控件的右边缘应该比面板窄几个像素减去垂直滚动条的宽度。 (也就是说,它应该足够窄,以便为垂直滚动条留出空间。)

现在运行它,并垂直调整表单的大小,使您希望出现一个 VERTICAL 滚动条。

问题:两个滚动条都出现了,因为垂直滚动条的存在减小了客户区的宽度,从而迫使水平滚动条出现。

显然,.NET 会先评估是否需要垂直滚动条,然后再评估是否应该出现水平滚动条,这取决于客户端大小是否因垂直滚动条的存在而减小。 (即相同的实验不会导致出现不必要的 VERTICAL 滚动条......只有水平滚动条。)

我正在使用 VB2008 Express,但我猜这会延续到更高版本。

我需要的解决方案:我需要以下任何一种:A)“仅垂直自动滚动”面板。 B)我需要一种方法来告诉面板“重新考虑”水平滚动条是否真的必要。 (刷新似乎不行。)

【问题讨论】:

  • 没有 cmets(直到现在)。没有赞成票(或反对票-显然-)。没有接受的答案(来吧!)。 1731 次观看。什么?

标签: vb.net scrollbar panels


【解决方案1】:

为了使用面板自动滚动属性,我这样做:

  1. panel.AutoScroll = False(我知道是反向的:D)
  2. panel.VerticalScroll.Visible = False 或 panel.Horizo​​ntalScroll.Visible = False

为了了解滚动条的尺寸,请使用

SystemInformation.HorizontalScrollBarHeight
SystemInformation.VerticalScrollBarWidth

这样您就可以在显示滚动条时更改面板的尺寸。

【讨论】:

    【解决方案2】:

    AutoScroll 属性不允许您对滚动条进行过多控制(即使您有 VerticalScrollHorizontalScroll 属性)。

    在建议的替代方案中,我选择选项 A; this post 中的标记答案为等效问题提供了非常有效的解决方案。转换和改编的代码(Panel1 是您问题中提到的面板):

    Private Declare Function ShowScrollBar Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal wBar As Integer, ByVal bShow As Boolean) As Boolean
    Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
        Try
            ShowScrollBar(Panel1.Handle, 0, False)
        Catch ex As Exception
        End Try
        MyBase.WndProc(m)
    End Sub
    

    如果您将面板的 AutoScroll 属性设置为 true 并添加此代码,您将获得所需的内容。

    注意:建议的代码可以工作,但要付出一定的代价:我个人打算尽可能避免使用Protected Overrides Sub WndProc 代码。如果准确获得此功能对您很重要,请依赖建议的方法;否则,您可能需要考虑其他替代方案(例如,AutoScroll = False 并将 VScrollBar 添加到面板中,该面板将始终存在)。

    【讨论】:

    • 为我工作,谢谢!在你之前我什么都找不到!
    • @AnonymousPi 感谢您让我知道这对某人有所帮助:)
    【解决方案3】:

    我遇到了听起来像你描述的东西。我只想要一个垂直滚动,因为它最终会包含很多东西,但不是水平滚动。我使用了表格布局面板;设置面板的垂直尺寸,以便 VScroll 显示;设置宽度以适应其中的内容以及您的代码将使用的任何边距或装订线。

    然后,在TableLayoutPanel 中将滚动面板的宽度设置为绝对宽度(我使用的宽度比 panel.width 多 2 个像素)。如果/当用户调整大小时,所有额外的大小都会分配给其他所有内容。基本上不要让滚动面板的宽度发生变化。可能也必须/想要设置最小表单大小。

    我添加的东西都是相同的宽度,如果你的不同,你可能需要设置它以适应最宽。

    不确定您是否遇到同样的事情,但听起来确实如此。

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 2014-09-21
      • 2012-08-06
      • 1970-01-01
      相关资源
      最近更新 更多