2013-10-06 50 views
1

场景:垂直和水平滚动条在面板

  • 将一个面板中的窗体上。
  • 将面板的BorderStyle设置为FixedSingle。 (只是让你可以看到它时,你运行它。)
  • 设置面板的自动滚屏=真
  • 设置面板的锚上,左,下,右
  • 在面板内部,将任何相当大的控制(按钮,picturebox或其他)。
  • 将控件的底边调整为面板底部以上的几个像素。
  • 调整控件的右边应该比面板更窄一些像素MINUS垂直滚动条的宽度。 (也就是说,它应该正好足够窄留有余地垂直滚动条可能会出现。)

现在运行它,并垂直调整形式短一点,这样你所期望的垂直滚动条来出现。

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

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

我使用VB2008快,但我猜这延续到更高版本。

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

+0

没有评论('直到现在)。没有upvotes(或downvotes -apparently-)。没有接受的答案(来吧!)。 1731次浏览。什么? –

回答

1

我遇到了一些听起来像你所描述的东西。我只想要一个垂直滚动,因为它最终将包含许多许多事情,但不是水平滚动。我使用了桌面布局面板;设置面板的垂直尺寸,以便VScroll显示;设置宽度以适应那里的内容,以及代码将使用的任何边距或阴影线。

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

我添加的东西都是相同的宽度,如果你的变化,你可能需要将其设置为适应最广泛的。

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

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财产,并添加该代码,你会得到你所期待的。

注:建议的代码工作,但以一定的价格:我个人打算尽可能避免Protected Overrides Sub WndProc代码。如果获得这种功能对你来说很重要,那么依靠所提出的方法;否则,您可能不得不考虑其他替代方案(例如,AutoScroll = False并将面板添加VScrollBar,该面板将始终存在)。

+0

为我工作,谢谢!我找不到任何东西,直到你! –

+0

@AnonymousPi感谢您让我知道这有助于某人:) – varocarbas

2

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

  1. panel.AutoScroll =假(是逆我知道:d)
  2. panel.VerticalScroll.Visible =假或panel.Horizo​​ntalScroll.Visible =假

为了知道scroolbars的尺寸使用

SystemInformation.HorizontalScrollBarHeight 
SystemInformation.VerticalScrollBarWidth 

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