根据Winforms / C#中的文本和字体大小确定标签大小

我想知道是否有更好的方法来解决这个问题。 我想调整一个标签(垂直)来容纳一定数量的文本。 我的标签有一个固定的宽度(约60字符之前,它必须包装),约495像素。 字体也是一个固定的大小(12点afaik),但文字不是。

我想要做的就是在“NewLine”或文本必须包装时增加标签高度; 这个想法是,文本在标签中是完全可见的。 AutoSize不起作用,因为它的宽度会增加,而不是高度。

当然,我可以计算NewLines的数量,并添加:Newlines * LineHeight,然后 – 我设法把每行60个字符,只是划分字符的数量,并根据需要添加尽可能多的LineHeight像素。

我想知道是否有更专业的方式来做到这一点。 我的方法太“跛脚”了吗?

提前致谢。

如何Graphics.MeasureString ,接受一个string,字体和最大宽度的重载? 这将返回一个SizeF ,所以您可以将Height舍入四舍五入。

  using(Graphics g = CreateGraphics()) { SizeF size = g.MeasureString(text, lbl.Font, 495); lbl.Height = (int) Math.Ceiling(size.Height); lbl.Text = text; } 

System.Drawing.Graphics有一个可以用于此目的的MeasureString方法。 使用带有string,字体和int“width”参数的重载; 最后一个参数指定string允许的最大宽度 – 使用此参数的标签设置宽度。

MeasureString返回一个SizeF对象。 使用此返回对象的Height属性来设置标签的高度。

注意:为了获得一个Graphics对象,你可以调用this.CreateGraphics。

Graphics.MeasureString()可能会帮助你。

这也是使用Control.CreateGraphics()调用的唯一用例之一!

 Size maxSize = new Size(495, int.MaxValue); _label.Height = TextRenderer.MeasureText(_label.Text , _label.Font, maxSize).Height; 

这个“答案”是为了将来的参考,并打击最初的假设,即AutoSize = true意味着它(一个WinForms标签)永远不会长高。

以下链接显示AutoSize = true与其他属性(如MaximumSize)的各种效果。 根据问题的预期用途,可以采用其中一种方法。

http://blogs.msdn.com/jfoscoding/articles/478299.aspx

我发布了一个解决这个问题的用户控件,在这里接受的答案是: TextBox控件中的自动缩放字体,使其尽可能大,仍然适合文本区域边界

该控件扩展了RichTextBox。 它有一个方法:ScaleFontToFit将自动调整字体的大小,使所有的文字适合。

整洁的事情是尊重多行财产。 如果它是真的,它允许文字包装,否则它不。

那么60个字符可能对您的testing文本有效,但不是所有的字符都有相同的宽度。 比如,比较一下
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

他们都有60个字符,但宽度却大不相同。

使用TextRenderer类来测量string是否有任何不利之处(比如在Marc的响应中),而不是通过创buildGraphics对象等工作?

根据这篇文章你应该使用TextRenderer如果你打算使用Windows窗体控件的最终输出。 TextRenderer和Graphics.MeasureString会给出不同的结果,所以使用匹配最终输出模式的结果。

在某些情况下,你必须使用compact框架,它没有任何的MeasureString()的覆盖方法,你可以考虑自己计算高度。

 private int YukseklikAyarla(string p, Font font, int maxWidth) { int iHeight = 0; using (Graphics g = CreateGraphics()) { var sizes = g.MeasureString(p, font); // THE ONLY METHOD WE ARE ALLOWED TO USE iHeight = (int)Math.Round(sizes.Height); var multiplier = (int)Math.Round((double)sizes.Width) / maxWidth; // DIVIDING THE TEXT WIDTH TO SEE HOW MANY LINES IT CAN HAS if (multiplier > 0) { iHeight = (int)(iHeight * (multiplier + 1)); // WE ADD 1 HERE BECAUSE THE TEXT ALREADY HAS A LINE } } return iHeight; }