当文本长于标签大小时,调整标签的文本大小?

我有一个显示文件名的标签..我必须将标签的AutoSize设置为False才能进行设计。
因此,当文件名文本比标签大小更长时……它就像图片一样被剪切。

在此处输入图像描述

 label1.Size = new Size(200, 32); label1.AutoSize = false; 

当文本长于标签大小时,如何自动调整文本大小以适应标签大小?

您可以在下面使用我的代码段。 系统需要一些循环来根据文本大小计算标签的字体。

 while(label1.Width < System.Windows.Forms.TextRenderer.MeasureText(label1.Text, new Font(label1.Font.FontFamily, label1.Font.Size, label1.Font.Style)).Width) { label1.Font = new Font(label1.Font.FontFamily, label1.Font.Size - 0.5f, label1.Font.Style); } 

标签缩放

  private void scaleFont(Label lab) { Image fakeImage = new Bitmap(1, 1); //As we cannot use CreateGraphics() in a class library, so the fake image is used to load the Graphics. Graphics graphics = Graphics.FromImage(fakeImage); SizeF extent = graphics.MeasureString(lab.Text, lab.Font); float hRatio = lab.Height / extent.Height; float wRatio = lab.Width / extent.Width; float ratio = (hRatio < wRatio) ? hRatio : wRatio; float newSize = lab.Font.Size * ratio; lab.Font = new Font(lab.Font.FontFamily, newSize, lab.Font.Style); } 

根据@brgerner提供的文章 ,我将在这里提供替代实现,因为标记为答案的那个不如下面这样有效或完整:

 public class FontWizard { public static Font FlexFont(Graphics g, float minFontSize, float maxFontSize, Size layoutSize, string s, Font f, out SizeF extent) { if (maxFontSize == minFontSize) f = new Font(f.FontFamily, minFontSize, f.Style); extent = g.MeasureString(s, f); if (maxFontSize <= minFontSize) return f; float hRatio = layoutSize.Height / extent.Height; float wRatio = layoutSize.Width / extent.Width; float ratio = (hRatio < wRatio) ? hRatio : wRatio; float newSize = f.Size * ratio; if (newSize < minFontSize) newSize = minFontSize; else if (newSize > maxFontSize) newSize = maxFontSize; f = new Font(f.FontFamily, newSize, f.Style); extent = g.MeasureString(s, f); return f; } public static void OnPaint(object sender, PaintEventArgs e, string text) { var control = sender as Control; if (control == null) return; control.Text = string.Empty; //delete old stuff var rectangle = control.ClientRectangle; using (Font f = new System.Drawing.Font("Microsoft Sans Serif", 20.25f, FontStyle.Bold)) { SizeF size; using (Font f2 = FontWizard.FlexFont(e.Graphics, 5, 50, rectangle.Size, text, f, out size)) { PointF p = new PointF((rectangle.Width - size.Width) / 2, (rectangle.Height - size.Height) / 2); e.Graphics.DrawString(text, f2, Brushes.Black, p); } } } } 

和用法:

 val label = new Label(); label.Paint += (sender, e) => FontWizard.OnPaint(sender, e, text); 

我使用以下加权缩放技巧来提供良好的拟合,即在拟合高度和拟合宽度之间进行加权折衷。 它在VB .net中,但我认为你可以轻松地转换为C#。

 Function shrinkFontToFit(f As Font, text As String, requiredsize As SizeF) As Font Dim actualsize As SizeF = TextRenderer.MeasureText(text, f) Return New Font(f.FontFamily, f.Size * (requiredsize.Width + requiredsize.Height ) _ / (actualsize.Width + actualsize.Height), f.Style, GraphicsUnit.Pixel) End Function 
 private void setFontSize(Label label1) { if (label1.Text.Length > 200) { label1.Font = new Font(label1.Font.FontFamily, 24f, label1.Font.Style); } else if (label1.Text.Length > 100) { label1.Font= new Font(label1.Font.FontFamily, 36f, label1.Font.Style); }else label1.Font = new Font(label1.Font.FontFamily, 48f, label1.Font.Style);//My orginal font size is 48f. } 

你可以自己编辑。

 private void button1_Click(object sender, EventArgs e) { Panel.Text = "Your Text"; setFontSize(Panel); } 

我认为最简单的方法是检查渲染大小,如果它大于实际标签大小,则减少标签的字体大小。

private void label3_Paint(object sender,PaintEventArgs e){

  Size sz = TextRenderer.MeasureText(label1.Text, label1.Font, label1.Size, TextFormatFlags.WordBreak); if (sz.Width > label1.Size.Width || sz.Height > label1.Size.Height) { DecreaseFontSize(label1); } } 

public void DecreaseFontSize(Label lbl){

  lbl.Font = new System.Drawing.Font(lbl.Font.Name, lbl.Font.Size - 1, lbl.Font.Style); }