Question

Si je donne TextRenderer.MeasureText un texte pour mesurer la largeur et l'utiliser retourne la hauteur nécessaire pour afficher ce texte.

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

Si je donne ce texte, la largeur et la hauteur à un LinkLabel il afficherait le texte dans la largeur et la hauteur fourni avec rien clipsé au large.

Cependant, si je mets un lien dans la collection LinkLabel.Links, LinkLabel dessinera le texte avec ce qui semble être un peu plus l'espacement entre les caractères et parfois cela entraînera la fin du texte à clipser. Est-il un moyen d'empêcher cela? Je l'ai essayé d'ajouter un rembourrage quand il y a un lien, mais il n'y a aucun moyen fiable de savoir exactement combien d'espace sera nécessaire. Y at-il d'autres façons de le faire?

Était-ce utile?

La solution

Vous devez utiliser Control.GetPreferredSize procédé pour calculer la largeur ou la hauteur nécessaire pour le contrôle (LinkLabel dans votre cas). Vous ne devriez pas utiliser measureText à ces fins, des explications plus détaillées, vous pouvez trouver ici (Précision des résultats TextRenderer.MeasureText.)

Autres conseils

Si un LinkLabel contient plus d'un lien, ou il y a des parties de texte qui sont ni dans un lien, le contrôle utilise Graphics.DrawString/MeasureString au lieu de TextRenderer.DrawText/MeasureText. Vous pouvez facilement le voir en action, la plus grande différence dans le rendu est avec la petite lettre L:

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 est un wrapper managé pour le DrawTextEx API . La valeur retournée provient de la struct LPRC. Vous pouvez regarder cette API pour plus de détails.

Je suppose que vous pouvez supprimer le style qui le rend souligné. linkLabel.Styles.Add("text-decoration", "none"); mais bien sûr, il ne serait pas ressembler à un lien. : - /

Une autre solution serait d'ajouter le rembourrage je suppose que vous.

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;

Pas la plus jolie des solutions, mais je suppose que cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top