GroupBox自动resize
拿一个GroupBox
,把let说成Label
,然后设置AutoSizeMode = GrowAndShrink
和AutoSize = true
。
会出现两个问题:
-
Label
和GroupBox
底部之间存在巨大差距(几乎足以适应另一个Label
lol); -
AutoSize
不尊重GroupBox.Text
属性。
问题是如何使GroupBox.AutoSize
正常工作 ? 正确的意思是:最小宽度应足以适合GroupBox.Text
,由于未知原因,下面应该没有间隙(它不是Margin
,也不是Padding
,看起来很丑)。
我试图在OnPaint
测量字符串长度并在那里设置MinimumSize
。 它有效,但我对此有疑问,好像我想稍后实际设置MinimumSize
– 它会在重绘后丢失。
更新,这里是截图:
您可以通过从GroupBox派生一个新类来调整底部边缘,从而消除底部不需要的黄色空间。 在VB中像…
Public Class BetterGroupBox Inherits GroupBox Public Overrides Function GetPreferredSize(ByVal proposedSize As Size) As Size Dim ns = MyBase.GetPreferredSize(proposedSize) Return New Size(ns.Width, ns.Height - 15) End Function End Class
很简单, Label
的位置固定在(0,0)
以外的某个点,试试这个:
label1.Location = Point.Empty;
您可能还想尝试将GroupBox
的Padding
设置为0
(默认值为3):
groupBox1.Padding = new Padding(0);
如果AutoSize = true
则在生成AutoSize = true
时,似乎GroupBox
控件具有预定义的填充填充。 也就是说,一旦控件(GroupBox内部)位于GroupBox底部的20个像素左右,GroupBox就会开始增长。 这会导致从最底部控件的底部到GroupBox底部的20个像素左右的填充(由@ Sinatr的附加图像以黄色突出显示)。
根据我的观察,在增加GroupBox的Width
时,填充似乎更少。
无论如何,您可以执行以下“绕过”问题:
public void MyFunction() { groupBox1.AutoSize = true; // Do stuff (eg, add controls to GroupBox)... // Once all controls have been added to the GroupBox... groupBox1.AutoSize = false; // Add optional padding here if desired. groupBox1.Height = myBottomMostControl.Bottom; }