it-swarm.com.de

Festlegen der Beschriftungsgröße basierend auf der Textmenge und der Schriftgröße in Winforms/C #

Ich würde gerne wissen, ob es einen besseren Ansatz für dieses Problem gibt. Ich möchte die Größe eines Etiketts (vertikal) ändern, um eine bestimmte Menge Text aufzunehmen. Mein Etikett hat eine feste Breite (etwa 60 Zeichen breit, bevor es umlaufen muss), etwa 495 Pixel. Die Schrift hat auch eine feste Größe (12 Punkte afaik), der Text jedoch nicht. 

Was ich tun möchte, ist die Etikettenhöhe zu erhöhen, wenn eine "NewLine" vorhanden ist oder der Text umbrochen werden muss. Die Idee ist, dass der Text im Etikett vollständig sichtbar ist. Die AutoSize-Funktion funktioniert nicht, da die Breite und nicht die Höhe zunimmt. 

Natürlich konnte ich die Anzahl der NewLines zählen und Folgendes hinzufügen: Newlines * LineHeight, und dann - es ist mir gelungen, 60 Zeichen pro Zeile zu setzen, einfach die Anzahl der Zeichen zu teilen und so viele LineHeight-Pixel hinzuzufügen, wie erforderlich.

Ich habe mich gefragt, ob es einen professionelleren Weg gibt. Ist mein Ansatz zu "lahm"?

Danke im Voraus.

39

Wie wäre es mit Graphics.MeasureString, mit der Überladung, die eine Zeichenfolge, die Schrift und die maximale Breite akzeptiert? Dies gibt eine SizeF zurück, sodass Sie die Height abrunden können.

        using(Graphics g = CreateGraphics()) {
            SizeF size = g.MeasureString(text, lbl.Font, 495);
            lbl.Height = (int) Math.Ceiling(size.Height);
            lbl.Text = text;
        }
90
Marc Gravell

System.Drawing.Graphics verfügt über eine MeasureString-Methode, die Sie für diesen Zweck verwenden können. Verwenden Sie die Überladung, die einen String, eine Schriftart und einen int-Parameter "width" annimmt. Dieser letzte Parameter gibt die maximal zulässige Breite für die Zeichenfolge an. Verwenden Sie für diesen Parameter die eingestellte Breite Ihres Labels.

MeasureString gibt ein SizeF-Objekt zurück. Verwenden Sie die Height-Eigenschaft dieses zurückgegebenen Objekts, um die Höhe Ihres Labels festzulegen.

Hinweis: Um zu diesem Zweck ein Graphics-Objekt zu erhalten, können Sie this.CreateGraphics aufrufen.

33
MusiGenesis

Graphics.MeasureString () wird Ihnen wahrscheinlich helfen.

Dies ist auch einer der einzigen Anwendungsfälle für die Verwendung des Control.CreateGraphics () - Aufrufs!

9
Quibblesome
Size maxSize = new Size(495, int.MaxValue);
_label.Height = TextRenderer.MeasureText(_label.Text , _label.Font, maxSize).Height;
5
Hacko

Diese "Antwort" dient als zukünftige Referenz und bekämpft die ursprüngliche Annahme, dass AutoSize = true impliziert, dass die Größe (ein WinForms-Label) niemals zunimmt.

Der folgende Link zeigt die verschiedenen Auswirkungen von AutoSize = true mit anderen Eigenschaften wie MaximumSize. Abhängig von der erwarteten Verwendung der Frage kann es angebracht sein, einen dieser Ansätze zu verfolgen.

http://blogs.msdn.com/jfoscoding/articles/478299.aspx

2
user166390

Ich habe ein Benutzersteuerelement bereitgestellt, das dieses Problem in der akzeptierten Antwort hier löst: Autoscale Font in einem TextBox-Steuerelement, damit es so groß wie möglich ist und in Textbereichsgrenzen passt

Das Steuerelement erweitert RichTextBox. Es gibt eine Methode: ScaleFontToFit, mit der die Schrift automatisch angepasst wird, um den gesamten Text anzupassen.

Eine nette Sache ist, dass es die mehrzeilige Eigenschaft respektiert. Wenn es wahr ist, können Wörter umbrochen werden, sonst nicht.

1
blak3r

In einigen Fällen, in denen Sie ein kompaktes Framework verwenden müssen, das keine Überschreibungsmethoden für MeasureString () hat, können Sie die Höhe selbst berechnen.

private int YukseklikAyarla(string p, Font font, int maxWidth)
    {
        int iHeight = 0;
        using (Graphics g = CreateGraphics())
        {
            var sizes = g.MeasureString(p, font); // THE ONLY METHOD WE ARE ALLOWED TO USE
            iHeight = (int)Math.Round(sizes.Height);
            var multiplier = (int)Math.Round((double)sizes.Width) / maxWidth; // DIVIDING THE TEXT WIDTH TO SEE HOW MANY LINES IT CAN HAS
            if (multiplier > 0)
            {
                iHeight = (int)(iHeight * (multiplier + 1)); // WE ADD 1 HERE BECAUSE THE TEXT ALREADY HAS A LINE
            }
        }
        return iHeight;
    }
0
Doğa Gençer

Gibt es einen Nachteil bei der Verwendung der TextRenderer -Klasse zum Messen der Zeichenfolge (wie in Marcs Antwort), anstatt die Arbeit zum Erstellen eines Graphics-Objekts usw. zu durchlaufen?

0
jean

Die 60 Zeichen sind möglicherweise für Ihren Testtext gültig, aber nicht alle Zeichen haben die gleiche Breite. Zum Beispiel vergleichen
Llllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
und
.wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww

Sie haben beide 60 Zeichen und weisen jedoch sehr unterschiedliche Breiten auf.

0
Yuliy

Gemäß diesem Artikel sollten Sie TextRenderer verwenden, wenn Sie ein Windows Form-Steuerelement für die endgültige Ausgabe verwenden. TextRenderer und Graphics.MeasureString liefern unterschiedliche Ergebnisse. Verwenden Sie also das Ergebnis, das Ihrem endgültigen Ausgabemodus entspricht. 

0
Barry Keller