2017-05-19 5 views
-1

Ich habe eine Schaltfläche, die die Schriftgröße des Textes geändert werden muss, basierend darauf, wie viel Text in der Schaltfläche ist. Dies wird während der Laufzeit dynamisch geändert.Auto-Größe mehrzeiliger Text in einer Schaltfläche

Grundsätzlich muss der Text ziemlich groß beginnen, dann muss er testen, wie viel Text in der Schaltfläche ist und entscheiden, ob in der Größe oder nicht gehen. Es könnte dies in einer Schleife tun, indem die Größe um eins verringert, neu gezeichnet und jedes Mal getestet wird, um zu sehen, ob der Text jetzt passt. Wenn nicht, Schleife erneut, bis es tut.

Aber das Problem ist mit dem Testen. Die Schaltfläche hat mehrzeiligen Text, und das ist die Art, wie ich es möchte. Ich kann also nicht einfach die Breite des Textes mit der Breite der Schaltfläche testen, indem ich etwas wie TextRenderer.MeasureText verwende, weil das bedeutet, dass der Text nur aus einer Zeile besteht. Es misst nie basierend darauf, ob es auf zwei oder mehr Zeilen passen kann.

Wenn also eine Textzeile in einer bestimmten Schriftart 40 Pixel hoch ist, zeigt TextRenderer.MeasureText.Height, selbst wenn sie 3 Zeilen Text auf der Schaltfläche enthält, 40 Pixel an. Und mit den Rändern und dem Auffüllen des Knopfes und dem Abstand zwischen den Textzeilen kann ich nicht einfach 40 * 3 machen, um zu sehen, wie viel 3 Zeilen wären, es ist nicht so einfach.

Also ... wie teste ich, ob der Text in der Schaltfläche zu groß für die Schaltfläche ist?

Ich könnte Auto-Ellipsis-Eigenschaft auf True setzen, aber es gibt keine Möglichkeit zu testen, ob die Auto-Ellipse verwendet wurde oder nicht. Das hilft also nicht.

Ich könnte Auto Size auf True setzen und testen, um zu sehen, ob die Größe der Schaltfläche geändert, dann zurück auf die richtige Größe und senken Sie die Textgröße, aber es ändert die Größe basierend auf Breite, bevor es Text auf die Sekunde verschiebt Linie, so ist es immer auf einer Linie. Das hilft also nicht.

Irgendwelche Ideen? Ich möchte nur mehrzeiligen Text automatisch formatieren. Es scheint so einfach zu sein.

+3

Welcher Rahmen? WinForms? WebForms? WPF? ... – squillman

+0

Yous sollte das Framework angeben, in WinForms würde ich 'Graphic.MeasureString' verwenden – bradbury9

+0

Sorry, ich dachte, es ist ein automatisches C# -Forum. Es ist .NET und C#. – Tazz250

Antwort

0

Hier finden Sie Lösungen für Windows Forms: Legen Sie die Startgröße auf TextBox fest, als die Größe von diesem Ereignishandler geändert wird.

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    var textBox = sender as TextBox; 
    if(!string.IsNullOrEmpty(textBox.Text)) 
    { 
     Graphics g = textBox.CreateGraphics(); 
     var width = g.MeasureString("a", textBox.Font).Width;//Get One Symbol Width 
     var totalWidth = width * textBox.Text.Length; // Calculate the width of the full text 
     if(totalWidth<width*10) // do what you want depending on conditions 
     { 
      textBox.Font=new Font(textBox.Font.Name,20f); 
     } 
     else if(totalWidth < width * 20) 
     { 
      textBox.Font = new Font(textBox.Font.Name, 16f); 
     } 
     else if(totalWidth < width * 30) 
     { 
      textBox.Font = new Font(textBox.Font.Name, 14f); 
     } 
     else if (totalWidth < width * 40) 
     { 
      textBox.Font = new Font(textBox.Font.Name, 12f); 
     } 
     else if (totalWidth < width * 50) 
     { 
      textBox.Font = new Font(textBox.Font.Name, 10f); 
     } 
    } 
} 
Verwandte Themen