tipo - Determine el tamaño de etiqueta según la cantidad de texto y el tamaño de letra en Winforms/C#
label visual basic (10)
Me gustaría saber si hay un mejor enfoque para este problema. Quiero cambiar el tamaño de una etiqueta (verticalmente) para acomodar cierta cantidad de texto. Mi etiqueta tiene un ancho fijo (unos 60 caracteres de ancho antes de que deba envolver), unos 495 píxeles. La fuente también tiene un tamaño fijo (12 puntos afaik), pero el texto no.
Lo que quiero hacer es aumentar la Altura de etiqueta cuando hay una "Nueva línea" o el texto debe envolver; la idea es que el texto sea completamente visible en la etiqueta. El tamaño automático no funciona porque crecerá en ancho, no en alto.
Por supuesto, podría contar el número de NewLines y agregar: Newlines * LineHeight, y luego-dado que logro poner 60 caracteres por línea, solo divida el número de caracteres y agregue tantos píxeles LineHeight como sea necesario.
Me preguntaba si había una forma más profesional de hacerlo. ¿Mi enfoque es demasiado "cojo"?
Gracias por adelantado.
¿Hay algún inconveniente en usar la clase TextRenderer para medir la cadena (como en la respuesta de Marc) en lugar de pasar por el trabajo para crear un objeto de Gráficos, etc.?
Bueno, los 60 caracteres pueden ser válidos para el texto de prueba, pero no todos los caracteres tienen el mismo ancho. Por ejemplo, comparar
llllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
y
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
Ambos tienen 60 caracteres y, sin embargo, tienen anchos muy diferentes.
En algunos casos donde debe usar un marco compacto, que no tiene ningún método de anulación para MeasureString (), puede considerar calcular la altura usted mismo.
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;
}
Esta "respuesta" es para referencia futura y para combatir la suposición inicial de que AutoSize = true implica que (una etiqueta de WinForms) nunca crecerá en altura.
El siguiente enlace muestra los diversos efectos de AutoSize = verdadero con otras propiedades como MaximumSize. Dependiendo del uso esperado de la pregunta, puede ser apropiado seguir uno de estos enfoques.
Graphics.MeasureString () probablemente lo ayude.
¡Este es también uno de los únicos casos de uso para usar la llamada Control.CreateGraphics ()!
Publiqué un control de usuario que resuelve este problema en la respuesta aceptada aquí: Fuente de escala automática en un control de cuadro de texto para que sea lo más grande posible y aún se ajuste en los límites de área de texto
El control se extiende a RichTextBox. Tiene un método: ScaleFontToFit que cambiará automáticamente el tamaño de la fuente para hacer que todo el texto encaje.
Lo bueno es que respeta la propiedad de líneas múltiples. Si es cierto, permite que las palabras se envuelvan, de lo contrario no es así.
Según este artículo , debe usar TextRenderer si va a usar un control de Windows Form para el resultado final. TextRenderer y Graphics.MeasureString darán resultados diferentes, por lo tanto, use el que coincida con su modo final de salida.
System.Drawing.Graphics tiene un método MeasureString que puede usar para este propósito. Use la sobrecarga que toma una cadena, una fuente y un parámetro int "ancho"; este último parámetro especifica el ancho máximo permitido para la cadena - use el ancho establecido de su etiqueta para este parámetro.
MeasureString devuelve un objeto SizeF. Use la propiedad Height de este objeto devuelto para establecer la altura de su etiqueta.
Nota: para obtener un objeto Graphics para este fin, puede llamar a this.CreateGraphics.
¿Qué hay de Graphics.MeasureString
, con la sobrecarga que acepta una cadena, la fuente y el ancho máximo? Esto devuelve un SizeF
, por lo que puede redondear el redondeo de la Height
.
using(Graphics g = CreateGraphics()) {
SizeF size = g.MeasureString(text, lbl.Font, 495);
lbl.Height = (int) Math.Ceiling(size.Height);
lbl.Text = text;
}
Size maxSize = new Size(495, int.MaxValue);
_label.Height = TextRenderer.MeasureText(_label.Text , _label.Font, maxSize).Height;