2012-03-02 16 views
17

Mam etykietę, która pokazuje nazwę pliku. Musiałem ustawić AutoSize etykiety na False do projektowania.
Tak więc, gdy tekst nazwy pliku był dłuższy niż rozmiar etykiety ... został obcięty jak na zdjęciu.Zmieniasz rozmiar tekstu etykiety, gdy tekst jest dłuższy niż rozmiar etykiety?

enter image description here

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

Jak mogę ponownie automatycznie rozmiar tekst do rozmiaru etykiety, gdy tekst jest dłuższy niż rozmiar etykiet?

+0

czego można się spodziewać się zdarzyć, jeśli tekst staje się długo wyświetlić w formularzu? –

+0

Ustaw znacznik dla frameworka GUI, WinForms lub asp.net lub innego. – brgerner

+1

@ M.Babcock Spodziewam się, że będzie on mniejszy, więc można go dopasować do etykiety –

Odpowiedz

23

Możesz użyć mojego fragmentu kodu poniżej. System potrzebuje trochę pętli do obliczenia czcionki etykiety na podstawie rozmiaru tekstu.

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

Musisz dodać kod, gdy etykieta jest większa, a czcionka musi się zwiększyć. – gonzobrains

+0

Zapętlanie jest nieefektywnym sposobem na znalezienie odpowiedniego rozmiaru. [odpowiedź jwaliszko] (https://stackoverflow.com/a/20457976/199364) lub [odpowiedź Andro72] (https://stackoverflow.com/a/25448687/199364) unikać pętli, mierząc jeden raz i obliczając stosunek . Podoba mi się użycie 'TextRenderer.MeasureText', jeśli' Graphics' nie jest dostępna. Mądrze byłoby zrobić coś takiego ** po ** jednej z tych innych odpowiedzi, na wypadek, gdyby obliczenie współczynnika skutkowało nieznacznie zbyt dużą etykietą. – ToolmakerSteve

5

podstawie article dostarczonych przez @brgerner, będę zapewnić alternatywną implementację tutaj, jako że jeden oznaczony jako odpowiedź nie jest tak skuteczne, ani kompletna, jak ten poniżej:

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

i użytkowanie:

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

Label skalowania

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

Może używać 'Windows.Forms.TextRenderer.MeasureText'; nie potrzebowałoby "fakeImage" ani "grafiki". – 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. 
    } 

Możesz edytować samodzielnie.

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

W przyszłości prosimy o wyjaśnienie odpowiedzi. –

+0

To jest słaba odpowiedź. O wiele lepsze odpowiedzi już istnieją. – ToolmakerSteve

0

używać ważonej następującą skalowania sprawę, aby zapewnić dobre dopasowanie, to znaczy ważona kompromis się między dopasowanie wysokości i dopasowanie szerokości. Jest w VB .net, ale myślę, że możesz łatwo przetłumaczyć na 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

Proszę wyjaśnić, kiedy * ważone * skalowanie byłoby odpowiednie/użyteczne. W przypadku najczęstszych zastosowań rozmiar musi zostać skrócony, aż tekst będzie pasował do * obu * wymiarów; kiedy ktoś chciałby skorzystać z tego podejścia? – ToolmakerSteve

-1

Myślę, że najprostszym sposobem mogłoby być sprawdzić rozmiar renderowania i jeśli jest ona większa niż rzeczywisty rozmiar etykiety, zmniejsz wielkość czcionki etykiety.

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

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

    } 
+0

** Czy przeczytałeś jedną z już istniejących odpowiedzi **, aby sprawdzić, czy robią coś podobnego? [Podpowiedź: istnieją podobne odpowiedzi, a oni wykonują lepszą robotę, ponieważ * powtarzają * test aż do znalezienia dopasowania, lub nawet lepiej, * szacują * jaki rozmiar będzie pasował po zmierzeniu raz.] – ToolmakerSteve

Powiązane problemy