¿Cambiar el tamaño del tamaño del texto de una etiqueta cuando el texto es más largo que el tamaño de la etiqueta?

Tengo una etiqueta que muestra el nombre del archivo … Tuve que establecer AutoSize of the label en False para el diseño.
Entonces, cuando el texto del nombre del archivo es más largo que el tamaño de la etiqueta … se cortó como en la imagen.

introduzca la descripción de la imagen aquí

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

¿Cómo redimensiono el texto automáticamente para que se ajuste al tamaño de la etiqueta, cuando el texto es más largo que el tamaño de la etiqueta?

Puede utilizar mi fragmento de código a continuación. El sistema necesita algunos bucles para calcular la fuente de la etiqueta en función del tamaño del texto.

 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); } 

Escala de etiqueta

  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); } 

Basado en el artículo proporcionado por @brgerner, proporcionaré la implementación alternativa aquí, ya que la que está marcada como respuesta no es tan eficiente ni completa como esta a continuación:

 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); } } } } 

y el uso:

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

Utilizo el siguiente truco de escala ponderada para proporcionar un buen ajuste, es decir, se realiza una compensación ponderada entre ajustar la altura y ajustar el ancho. Está en VB .net, pero creo que puedes traducir a C # fácilmente.

 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. } 

Puedes editar por ti mismo.

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

Creo que la forma más fácil podría ser verificar el tamaño de renderizado y si es mayor que el tamaño real de la etiqueta, reducir el tamaño de fuente de la etiqueta.

private void label3_Paint (objeto remitente, 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); }