Frage

Wenn ich gebe TextRenderer.MeasureText einen Text zu messen und Breite, es zu benutzen wird die Höhe zurückkehrt erforderlich, dass Text angezeigt werden soll.

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 gebe, dass Text, Breite und Höhe auf ein Linklabel würde es den Text in der Breite und Höhe mit nichts abgeschnitten vorgesehen angezeigt werden soll.

Allerdings, wenn ich einen Link in die LinkLabel.Links Sammlung zu setzen, wird das Linklabel den Text mit ziehen, was scheint, ein wenig mehr Abstand zwischen den Zeichen zu sein, und manchmal wird dies das Ende des Textes bewirken abgeschnitten. Gibt es trotzdem, dies zu verhindern? Ich habe versucht, indem Polsterung, wenn es eine Verbindung gibt, aber es gibt keine zuverlässige Möglichkeit, genau zu wissen, wie viel mehr Platz benötigt. Gibt es noch andere Möglichkeiten, dies zu tun?

War es hilfreich?

Lösung

Sie sollten verwenden Control.GetPreferredSize Verfahren Breite oder Höhe zur Steuerung (Linklabel in diesem Fall) benötigt berechnen. Sie sollten nicht measureText für solche Zwecke, ausführlichere Erklärung verwenden, können Sie finden Sie hier (Accuracy von TextRenderer.MeasureText Ergebnissen.)

Andere Tipps

Wenn ein LinkLabel enthält mehr als einen Link, oder gibt es Teile des Textes, die noch in einer Verbindung sind, dann ist die Steuerung verwendet Graphics.DrawString/MeasureString statt TextRenderer.DrawText/MeasureText. Sie können es leicht in Aktion sehen, 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 

TextRenderer.MeasureText ist eine verwaltete Wrapper für die DrawTextEx API. Der zurückgegebene Wert kommt aus der LPRC Struktur. Sie könnten an dieser API, um weitere Informationen zu suchen.

Ich denke, man könnte den Stil entfernen, die sie unterstreichen macht. linkLabel.Styles.Add("text-decoration", "none"); aber dann wäre es natürlich nicht wie ein Link zu suchen. : - /

Eine andere Lösung wäre, die Polsterung hinzufügen selbst, 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 hübscheste von Lösungen, aber ich würde vermuten, es funktioniert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top