C# GroupBox自动调整大小

C# GroupBox自动调整大小,c#,winforms,autosize,groupbox,C#,Winforms,Autosize,Groupbox,拿一个GroupBox,放在里面,比如说Label,然后设置AutoSizeMode=growthandshrink和AutoSize=true 会出现两个问题: Label和GroupBox底部之间有一个巨大的间隙(几乎足以容纳另一个Labellol) AutoSize不尊重GroupBox.Text属性 问题是如何使GroupBox.AutoSize正常工作?正确的意思是:最小宽度应该足够容纳GroupBox.Text,下面应该没有未知原因的间隙(它不是Margin,也不是Padding

拿一个
GroupBox
,放在里面,比如说
Label
,然后设置
AutoSizeMode=growthandshrink
AutoSize=true

会出现两个问题:

  • Label
    GroupBox
    底部之间有一个巨大的间隙(几乎足以容纳另一个
    Label
    lol)
  • AutoSize
    不尊重
    GroupBox.Text
    属性
问题是如何使GroupBox.AutoSize正常工作?正确的意思是:最小宽度应该足够容纳
GroupBox.Text
,下面应该没有未知原因的间隙(它不是
Margin
,也不是
Padding
,看起来很难看)


我尝试在
OnPaint
中测量字符串长度,并在那里设置
MinimumSize
。它可以工作,但我对此表示怀疑,好像我以后真的想设置
MinimumSize
——它在重新绘制后会丢失


更新,这里是截图:


很简单,您的
标签的位置固定在
(0,0)
以外的某个点,请尝试以下操作:

label1.Location = Point.Empty;
您还可以尝试将
分组框的
填充设置为
0
(默认值为3):


通过从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

如果
AutoSize=true
,则在增加控件时,
GroupBox
控件似乎具有预定义的排序填充。也就是说,一旦控件(位于GroupBox内)位于GroupBox底部20像素以内,GroupBox就会开始增长。这将导致从最底部控件的底部到GroupBox的底部填充20像素左右(如@Sinatr的附加图像以黄色突出显示)

根据我的观察,当GroupBox的
宽度增加时,填充似乎减少了

无论如何,你可以做如下“绕开”这个问题:

    public void MyFunction()
    {
        groupBox1.AutoSize = true;

        // Do stuff (e.g., 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;
    }

不起作用。设置此值,然后
GroupBox.AutoSize=true
将折叠组框,使其具有1像素宽度或其他宽度。有趣的是,折叠的分组框的高度将同样大于所需的高度(以便在
label1
下再放置~1个
Label
)。这个答案如何解决第二个问题(使用
GroupBox.Text
)?@Sinatr请发布您的屏幕截图。我试过了,它几乎缩小到内部
标签的大小@Sinatr大小取决于
GroupBox的文本,不是更好吗?显然
label1
位置不是
点(0,0)
?你甚至没有试过我的解决方案。是的,我试过了,但不起作用。我在回答中说了这一点。希望我发布另一个屏幕截图,其中
GroupBox
被折叠(因为没有任何东西可以阻止
自动调整大小
将父对象的大小减少为零)。请告诉我,我现在该怎么回答这个问题?我有一个问题,很明显,没有解决,来自微软,但我的问题被搁置,所以没有人会费心回答。再发一次?
    public void MyFunction()
    {
        groupBox1.AutoSize = true;

        // Do stuff (e.g., 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;
    }