如何自动调整标签的高度而不是宽度

38

我正在程序中创建一个面板(Panel),并向其中添加多个组件。

其中一个组件是一个标签(Label),它将包含用户生成的内容。

我不知道标签的高度应该是多少,但它的宽度是固定的。

如何设置高度以便显示所有文本,而不改变宽度?

3个回答

81

只需使用AutoSize属性,将其设置为True

MaximumSize属性设置为(60, 0),这样它就无法水平增长,只能垂直增长。


3
如果似乎无法正常工作,请检查'borderStyle'是否设置为'none'。也许您想修复甚至是最小大小(例如对于固定宽度的单行文本,MinimumSize = MaximumSize =(60,13))。 - Fil

5

使用Graphics.MeasureString方法:

public SizeF MeasureString(
    string text,
    Font font,
    int width
)

该函数的width参数指定了返回的SizeF结构体(Width)中宽度组件的最大值。如果width参数小于字符串的实际宽度,则返回的Width组件将被截断为一个代表在指定宽度内可以容纳的最大字符数的值。为了适应整个字符串,返回的Height组件将被调整为一个允许使用字符换行显示字符串的值。换句话说,该函数可以根据给定的宽度计算出字符串的高度。

1
我认为你可以使用 Graphics.FromHwnd(myLabel.Handle) 来获取 Graphics 对象。 - Brian
2
如果你要进行这样的测量,建议使用TextRenderer.MeasureText()。Graphics.DrawString()已经过时,而且输出结果也不同。从技术上讲,必须使用UseCompatibleTextRendering属性在两者之间进行选择。这很麻烦。 - Hans Passant

1
如果您有一个标签并且想要控制垂直适配,可以执行以下操作:
MyLabel.MaximumSize = new Size(MyLabel.Width, 0)
MyLabel.Height = MyLabel.PreferredHeight
MyLabel.MaximumSize = new Size(0, 0)

这在编程中很有用,特别是当你的标签在一个可以调整大小的容器中时。这种情况下,你可以设置Anchor属性,使标签在水平方向上调整大小,但不影响垂直方向。在调整大小事件中,你可以使用上述方法来适应高度。
为避免垂直调整被解释为新的调整大小事件,你可以使用布尔值。
bool _inVerticalFit = false;

在调整大小事件中:
if (_inVerticalFit) return;
_inVerticalFit = true;
MyLabel.MaximumSize = new Size(MyLabel.Width, 0)
MyLabel.Height = MyLabel.PreferredHeight
MyLabel.MaximumSize = new Size(0, 0)
_inVerticalFit = false;

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