2012-03-02 38 views
17

Tengo una etiqueta que muestra el nombre del archivo. Tuve que configurar AutoSize de la etiqueta a False para el diseño.
Así que cuando el texto del nombre del archivo se alargó más que el tamaño de la etiqueta ... se cortó como en la imagen.¿Cambia el tamaño del texto de una etiqueta cuando el texto es más largo que el tamaño de la etiqueta?

enter image description here

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

¿Cómo re-tamaño del texto automáticamente para adaptarse al tamaño de la etiqueta, cuando el texto es más largo que el tamaño de la etiqueta?

+0

¿Qué espera que suceda si el texto se convierte a largo para mostrar en el formulario? –

+0

Configure la etiqueta para el marco de GUI, WinForms o asp.net u otro. – brgerner

+1

@ M.Babcock espero que se haga más pequeño para que pueda adaptarse a la etiqueta –

Respuesta

23

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

Debe agregar el código para cuando la etiqueta sea más grande y la fuente tenga que aumentar de tamaño. – gonzobrains

+0

Looping es una forma ineficiente de encontrar un buen tamaño. [respuesta de jwaliszko] (https://stackoverflow.com/a/20457976/199364) o [respuesta de Andro72] (https://stackoverflow.com/a/25448687/199364) evite el bucle, midiendo una vez y calculando una proporción . Me gusta el uso de 'TextRenderer.MeasureText', si' Graphics' no está disponible. Y podría ser conveniente hacer algo como esto ** después de ** una de esas otras respuestas, en caso de que el cálculo de la razón dé como resultado una etiqueta ligeramente demasiado grande. – ToolmakerSteve

5

Sobre la base de la article proporcionada por @brgerner, voy a proporcionar la implementación alternativa aquí, al igual que una marca como una respuesta no es tan eficiente ni completa como ésta 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); 
6

Etiqueta escalar

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

    } 
+0

Podría usar 'Windows.Forms.TextRenderer.MeasureText'; no necesitaría 'fakeImage' o' graphics'. – ToolmakerSteve

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

Puede editarlo usted mismo.

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

En el futuro, por favor explique su respuesta. –

+0

Esta es una respuesta débil. Ya existen respuestas mucho mejores. – ToolmakerSteve

0

I Utilice el siguiente truco de escala ponderada para proporcionar un buen ajuste, es decir, una solución de compromiso ponderado se hace entre el racor la altura y el ajuste de la anchura. 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 
+0

Explique cuándo * escalamiento * ponderado sería apropiado/útil. Para el uso más común, el tamaño debe reducirse hasta que el texto se ajuste a * ambas * dimensiones; ¿Cuándo querría uno usar el enfoque aquí? – ToolmakerSteve

-1

creo que la forma más fácil podría ser para comprobar el tamaño rendir y si es mayor que el tamaño real de la etiqueta, disminuir el tamaño de fuente de la etiqueta.

privada label3_Paint void (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 (LBL Label) {

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

    } 
+0

** ¿Has leído alguna de las respuestas ya existentes **, para ver si hacen algo similar? [Sugerencia: hay respuestas similares, y hacen un mejor trabajo, porque * repiten * la prueba hasta que se encuentra un ajuste, o incluso mejor, * estiman * qué tamaño cabe después de medir una vez.] – ToolmakerSteve

Cuestiones relacionadas