2009-06-04 10 views
2

Wenn ich TextRenderer.MeasureText Text zu messen und die Breite zu geben geben Sie die Höhe zurück, die benötigt wird, um diesen Text anzuzeigen.LinkLabel benötigt mehr Platz als TextRenderer.MeasureText sagt

private static int CalculateHeight(string text, Font font, int width) 
{ 
    Size size = TextRenderer.MeasureText(text, font, new Size(width, Int32.MaxValue), TextFormatFlags.NoClipping | TextFormatFlags.WordBreak); 
    return size.Height; 
} 

Wenn ich diesen Text, Breite und Höhe zu einem Linklabel geben würde es den Text in der Breite und Höhe mit nichts abgeschnitten versehen anzuzeigen.

Wenn ich jedoch einen Link in die LinkLabel.Links-Sammlung lege, wird der LinkLabel den Text mit etwas mehr Abstand zwischen den Zeichen zeichnen, was manchmal dazu führt, dass das Ende des Textes abgeschnitten wird . Gibt es das überhaupt, um das zu verhindern? Ich habe versucht, Padding hinzuzufügen, wenn es einen Link gibt, aber es gibt keine zuverlässige Möglichkeit, genau zu wissen, wie viel mehr Speicherplatz benötigt wird. Gibt es andere Möglichkeiten, dies zu tun?

Antwort

0

TextRenderer.MeasureText ist ein verwalteter Wrapper für die API DrawTextEx. Der zurückgegebene Wert stammt von der lprc-Struktur. Vielleicht möchten Sie sich die API für weitere Details ansehen.

+0

Wenn die Korrektur eine korrekte Messung erfordert und dann immer noch das LinkLabel-Steuerelement verwendet, scheint es, als ob entweder MeasureText oder DrawTextEx darauf aufmerksam gemacht werden müssten Der Text wird als Link angezeigt, aber keiner hat so etwas. Wie ich in der Frage gesagt habe, funktioniert MeasureText gut, wenn der Text nur als reiner Text angezeigt wird. –

+0

Haben Sie AutoSize für LinkLabel aktiviert? –

+0

Nein, ich tue nicht ... –

0

Ich denke, Sie könnten den Stil, der es unterstreicht, entfernen. linkLabel.Styles.Add("text-decoration", "none"); aber dann würde es natürlich nicht wie ein Link aussehen. : -/

Eine andere Lösung wäre, die Polsterung selbst hinzuzufügen, denke ich.

int heightBefore = linkLabel.Height; 
int fontHeight = CalculateHeight(linkLabel.Text, linkLabel.Font, linkLabel.Width); 
int paddingHeight = heightBefore - fontHeight; 
linkLabel.Font = otherFont; 
linkLabel.Height = CalculateHeight(linkLabel.Text, otherFont, linkLabel.Width); 
linkLabel.Height += paddingHeight; 

Nicht die schönsten Lösungen, aber ich würde vermuten, dass es funktioniert.

1

Wenn ein LinkLabel mehr als einen Link enthält oder Teile des Texts nicht in einem Link enthalten sind, verwendet das Steuerelement Graphics.DrawString/MeasureString anstelle von TextRenderer.DrawText/MeasureText. Sie können sehen, es leicht in Aktion, der größte Unterschied in Rendering mit dem kleinen L Brief ist:

linkLabel1.Text = new string('l', 100); // 100 x small L 
linkLabel1.LinkArea = new LinkArea(0, 50); 
linkLabel2.Text = new string('l', 100); // 100 x small L 
+0

Nein, DrawString wird nur verwendet, wenn UseCompatibleTextRendering aktiviert ist. –

+0

Es tut mir leid, aber Sie sind nicht richtig. Überzeugen Sie sich selbst und benutzen Sie diesen Code: linkLabel1.Text = neuer String ('l', 100); // 100 x klein L linkLabel1.LinkArea = neuer LinkArea (0, 50); linkLabel2.Text = neuer String ('l', 100); // 100 x klein L – LukeSw

+0

Ihr Vorschlag funktionierte in meiner Test-App beim Testen von normalen Labels und LinkLabels, aber in meiner realen Anwendung war die Control.GetPreferredSize-Methode das einzige, was funktionierte. –

Verwandte Themen