2012-03-02 4 views
17

Ho un'etichetta che mostra il nome del file .. Ho dovuto impostare AutoSize dell'etichetta su False per la progettazione.
Quindi, quando il testo del nome del file ha superato le dimensioni dell'etichetta, è stato tagliato come nell'immagine.Ridimensiona le dimensioni del testo di un'etichetta quando il testo ha superato la dimensione dell'etichetta?

enter image description here

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

Come si ri-size il testo automaticamente in base alle dimensioni dell'etichetta, quando il testo è più lungo del formato dell'etichetta?

+0

Cosa vi aspettate che accada se il testo diventa a lungo da visualizzare sul modulo? –

+0

Imposta il tag per framework GUI, WinForms o asp.net o altro. – brgerner

+1

@ M.Babcock mi aspetto che diventi più piccolo in modo che possa adattarsi all'etichetta –

risposta

23

È possibile utilizzare il mio snippet di codice di seguito. Il sistema ha bisogno di alcuni cicli per calcolare il carattere dell'etichetta in base alle dimensioni del testo.

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

È necessario aggiungere il codice per quando l'etichetta è più grande e il carattere deve aumentare di dimensioni. – gonzobrains

+0

Looping è un modo inefficiente per trovare una buona dimensione. [risposta di jwaliszko] (https://stackoverflow.com/a/20457976/199364) o [risposta di Andro72] (https://stackoverflow.com/a/25448687/199364) evitare il looping, misurando una volta e calcolando un rapporto . Mi piace l'uso di 'TextRenderer.MeasureText', se un' Graphics' non è disponibile. E potrebbe essere saggio fare qualcosa del genere ** dopo ** una di quelle altre risposte, nel caso in cui il calcolo del rapporto si traduca in un'etichetta leggermente troppo grande. – ToolmakerSteve

5

Sulla base del article fornito da @brgerner, fornirò l'implementazione alternativa qui, come quello contrassegnato come risposta non è così efficiente né completo come questo qui sotto:

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

e l'utilizzo:

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

Label ridimensionamento

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

Potrebbe utilizzare 'Windows.Forms.TextRenderer.MeasureText'; non avrebbe bisogno di '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. 
    } 

È possibile modificare da soli.

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

In futuro, per favore qualche spiegazione alla tua risposta. –

+0

Questa è una risposta debole. Esistono già risposte molto migliori. – ToolmakerSteve

0

Uso il seguente trucco scala ponderata per fornire una buona misura, cioè un compromesso pesata viene fatta tra montare l'altezza e la larghezza raccordo. È in VB .net, ma penso che tu possa tradurre facilmente in 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 
+0

Spiegare quando il ridimensionamento * ponderato * sarebbe appropriato/utile. Per l'uso più comune, la dimensione deve essere ridotta fino a quando il testo non si adatta * a * dimensioni; quando invece vorrebbe usare l'approccio qui? – ToolmakerSteve

-1

Credo che il modo più semplice potrebbe essere quello di controllare la dimensione rendering e se è maggiore della dimensione effettiva dell'etichetta, diminuire il fontsize dell'etichetta.

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

     } 
    } 

vuoto DecreaseFontSize (LBL Label) pubblica {

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

    } 
+0

** Hai letto una delle risposte già esistenti **, per vedere se fanno qualcosa di simile ?? [Suggerimento: ci sono risposte simili, e fanno un lavoro migliore, perché ripetono * il test fino a quando non viene trovata una misura o, ancora meglio, * stimano * quale dimensione si adatta dopo aver misurato una volta.] – ToolmakerSteve