GroupBox自动resize

拿一个GroupBox ,把let说成Label ,然后设置AutoSizeMode = GrowAndShrinkAutoSize = true

会出现两个问题:

  • LabelGroupBox底部之间存在巨大差距(几乎足以适应另一个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; 

您可能还想尝试将GroupBoxPadding设置为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; }