Pregunta

Si reparto TextRenderer.MeasureText algún texto para medir la anchura y utilizarlo devolverá la altura necesaria para mostrar que el texto.

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 reparto entre ese texto, anchura y altura a un LinkLabel sería mostrar el texto en la anchura y altura provista con nada recortada.

Sin embargo, si pongo un enlace a la colección LinkLabel.Links, LinkLabel dibujará el texto con lo que parece ser un poco más de espacio entre los caracteres y, a veces esto hará que el final del texto a ser cortada. ¿Hay alguna forma de prevenir esto? He intentado añadir relleno cuando hay un vínculo, pero no hay manera segura de saber exactamente cómo se necesitará mucho más espacio. ¿Hay otras maneras de hacer esto?

¿Fue útil?

Solución

Debe utilizar Control.GetPreferredSize método para calcular anchura o la altura necesaria para el control (LinkLabel en su caso). No debe usar measureText para tales fines, la explicación más detallada se puede encontrar aquí (Precisión de los resultados TextRenderer.MeasureText.)

Otros consejos

Si un LinkLabel contiene más de un enlace, o hay partes de texto que son ni en un enlace, entonces el control utiliza Graphics.DrawString/MeasureString en lugar de TextRenderer.DrawText/MeasureText. Se puede ver fácilmente en la acción, la mayor diferencia en la representación es con la pequeña letra 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 es un contenedor administrado para la DrawTextEx API . El valor devuelto viene de la estructura LPRC. Es posible que desee mirar a esa API para más detalles.

Creo que se puede quitar el estilo que lo hace subrayado. linkLabel.Styles.Add("text-decoration", "none"); pero entonces por supuesto que no se vería como un enlace. : - /

Otra solución sería añadir el relleno mismo supongo.

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;

No es la más bonita de las soluciones, pero yo supongo que funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top