GroupBox自适应大小

8
拿一个GroupBox,把Label放进去,然后设置AutoSizeMode = GrowAndShrink和AutoSize = true。会出现两个问题:
1. Label和GroupBox底部之间有巨大的空隙(足以容纳另一个Label); 2. AutoSize不遵循GroupBox.Text属性。
问题是如何使GroupBox.AutoSize正常工作? 正常意味着:最小宽度应足以适应GroupBox.Text,下面不应该有任何未知原因的空隙(既不是Margin也不是Padding,看起来非常丑陋)。
我尝试在OnPaint中测量字符串长度并在那里设置MinimumSize。 这有效,但我对此表示怀疑,因为如果我想实际设置MinimumSize - 重绘后将会丢失。
更新,这里是截图:

很明显,label1的位置不是Point(0,0)吧?你甚至都没有尝试我的解决方案。 - King King
是的,我尝试过了,但它不起作用。我在答案中已经说过了。你想让我发布另一个屏幕截图,其中“GroupBox”已折叠(因为没有任何东西阻止“AutoSize”将父级大小减少到零)。请告诉我,现在我该怎么做这个问题?我有一个明显未解决的来自Microsoft的问题,但我的问题被搁置了,所以没有人会去回答它。重新发布一遍吗? - Sinatr
3个回答

5
您可以通过从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

1
似乎GroupBox控件在AutoSize = true时,在增大控件大小时有一种预定义的填充。也就是说,一旦一个控件(在GroupBox内部)接近GroupBox底部的20像素左右,GroupBox就会开始增长。这会导致最下面的控件底部与GroupBox底部之间有大约20像素的填充(如@Sinatr所附图像中所示的黄色高亮部分)。
根据我的观察,当增加GroupBox的Width时,填充似乎较少。
无论如何,您可以采取以下方法“绕过”此问题:
    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;
    }

1
“很简单,你的Label位置固定在除了(0,0)之外的某个点上,试试这个:”
label1.Location = Point.Empty;

您可能还想尝试将 GroupBoxPadding 设置为全部为 0(默认值为 3):
groupBox1.Padding = new Padding(0);

不起作用。设置了这个之后,然后 GroupBox.AutoSize = true 会使组框折叠成1像素宽或者其他什么的。有趣的是,折叠的组框的高度将比需要的更大(以适应在 label1 下面放置 ~一个 Label)。这个答案如何解决第二个问题(与 GroupBox.Text 相关)? - Sinatr
@Sinatr请发布您的屏幕截图。我已经尝试过这个,它几乎缩小到内部“Label”的大小。 - King King
@Sinatr,大小根据“GroupBox”的文本进行调整,这样不是更好吗? - King King

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接