2011-01-12 8 views
29

Tengo un Panel que estoy creando mediante programación; adicionalmente le agrego varios componentes.Cómo AutoSize la altura de una etiqueta pero no el ancho

Uno de estos componentes es un Label que contendrá contenido generado por el usuario.

No sé qué altura debe tener la etiqueta, pero sí tiene un ancho fijo.

¿Cómo puedo configurar la altura para que muestre todo el texto, sin cambiar el ancho?

Respuesta

60

Simplemente use la propiedad AutoSize, configúrela de nuevo a True.

Establezca la propiedad MaximumSize en, por ejemplo, (60, 0), por lo que no puede crecer horizontalmente, solo verticalmente.

+0

+1. Mucho más simple que mi sugerencia. – Brian

+0

Seleccionada como la respuesta debido a la simplicidad, la respuesta de Brian también es perfectamente buena, pero esta es más fácil de entender y mantener. – Malfist

+0

¿Qué pasa si necesito un ancho de fluido? – Robin

5

Uso Graphics.MeasureString:

public SizeF MeasureString(
    string text, 
    Font font, 
    int width 
) 

El parámetro de anchura especifica el valor máximo de la componente anchura de la estructura SizeF vuelto (anchura). Si el parámetro de ancho es menor que el ancho real de la cadena , el componente Ancho devuelto se trunca a un valor que representa el número máximo de caracteres que encajará dentro del ancho especificado. Para acomodar toda la cadena, el componente de altura devuelto se ajusta a un valor que permite mostrar la cadena con ajuste de caracteres.

En otras palabras, esta función se puede calcular la altura de su cadena en función de su anchura.

+1

creo que usted debería ser capaz de use 'Graphics.FromHwnd (myLabel.Handle)' para obtener el objeto 'Graphics'. – Brian

+0

+1 Buena respuesta. ¿Alguna razón por la que no incluyó el bit Graphics.FromHwnd (myLabel.Handle) en la respuesta? –

+1

@Confrad: No. – Brian

0

Si usted tiene una etiqueta y que desea tener el control sobre la el ajuste vertical, se puede hacer lo siguiente:

MyLabel.MaximumSize = new Size(MyLabel.Width, 0) 
MyLabel.Height = MyLabel.PreferredHeight 
MyLabel.MaximumSize = new Size(0, 0) 

Esto es útil, por ejemplo, si tiene una etiqueta en un envase que se puede cambiar de tamaño . En ese caso, puede establecer la propiedad Anchor para que la etiqueta se cambie de tamaño horizontalmente pero no verticalmente, y en el evento de cambio de tamaño, puede ajustar la altura utilizando el método anterior.

Para evitar el ajuste vertical para ser interpretado como un nuevo evento de cambio de tamaño, se puede utilizar un valor lógico:

bool _inVerticalFit = false; 

Y en el caso de cambio de tamaño:

if (_inVerticalFit) return; 
_inVerticalFit = true; 
MyLabel.MaximumSize = new Size(MyLabel.Width, 0) 
MyLabel.Height = MyLabel.PreferredHeight 
MyLabel.MaximumSize = new Size(0, 0) 
_inVerticalFit = false; 
Cuestiones relacionadas