1

设想:

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

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

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

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

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

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

4

3 回答 3

3

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

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

为了知道 scroolbars 的尺寸,请使用

SystemInformation.HorizontalScrollBarHeight
SystemInformation.VerticalScrollBarWidth

因此,您可以在显示滚动条时更改面板的尺寸。

于 2014-01-21T09:51:29.373 回答
2

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

在建议的替代方案中,我选择选项 A;这篇文章中的标记答案为等效问题提供了非常有效的解决方案。转换和改编的代码(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将 a 添加VScrollBar到面板中,该面板将始终存在)。

于 2013-10-06T17:21:33.597 回答
1

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

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

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

不确定你是否遇到同样的事情,但肯定听起来像。

于 2013-10-06T16:38:59.897 回答