Ajuste de Word para una etiqueta en Windows Forms

¿Cómo podemos obtener la función de ajuste de palabras para una etiqueta en Windows Forms ?

Coloqué una etiqueta en un panel y agregué un poco de texto para etiquetar de forma dinámica. Pero excede la longitud del panel. ¿Como puedo resolver esto?

La respuesta rápida: desactive AutoSize .

El gran problema aquí es que la etiqueta no cambiará automáticamente su altura (solo ancho). Para hacerlo bien, deberá subclasificar la etiqueta e incluir la lógica de cambio de tamaño vertical.

Básicamente, lo que debes hacer en OnPaint es:

  1. Mida la altura del texto (Graphics.MeasureString).
  2. Si la altura de la etiqueta no es igual a la altura del texto, establezca la altura y el retorno.
  3. Dibuja el texto.

También necesitará establecer el indicador de estilo ResizeRedraw en el constructor.

En realidad, la respuesta aceptada es innecesariamente complicada.

Si configura la etiqueta como AutoSize, crecerá automáticamente con el texto que ponga en ella. (Esto incluye crecimiento vertical)

Si desea ajustar la palabra en un ancho determinado, puede establecer la propiedad MaximumSize.

myLabel.MaximumSize = new Size(100, 0); myLabel.AutoSize = true; 

Probado y funciona.

En mi caso (etiqueta en un panel) establecí label.AutoSize = false y label.Dock = Fill . Y el texto de la etiqueta se envuelve automáticamente.

Malas noticias: no hay una propiedad de auto envoltura.

Buenas noticias: ¡hay una luz al final del túnel!

Puede lograr esto programáticamente para dimensionarlo de forma dinámica, pero esta es la solución más fácil:

  • Seleccione las propiedades de la etiqueta
  • AutoSize = True
  • MaximumSize = ( ancho , alto) donde Ancho = tamaño máximo que desea que tenga la etiqueta y Altura = cuántos píxeles desea que se ajuste

    Propiedades de muestra

Desde MSDN , ajuste automáticamente el texto en la etiqueta :

 using System; using System.Text; using System.Drawing; using System.Windows.Forms; public class GrowLabel : Label { private bool mGrowing; public GrowLabel() { this.AutoSize = false; } private void resizeLabel() { if (mGrowing) return; try { mGrowing = true; Size sz = new Size(this.Width, Int32.MaxValue); sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak); this.Height = sz.Height; } finally { mGrowing = false; } } protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); resizeLabel(); } protected override void OnFontChanged(EventArgs e) { base.OnFontChanged(e); resizeLabel(); } protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); resizeLabel(); } } 

Tenía que encontrar una solución rápida, así que solo usé un TextBox con esas propiedades:

 var myLabel = new TextBox { Text = "xxx xxx xxx", WordWrap = true, AutoSize = false, Enabled = false, Size = new Size(60, 30), BorderStyle = BorderStyle.None, Multiline = true, BackColor = container.BackColor }; 

Tener uno mejor basado en la respuesta de @hypo

 public class GrowLabel : Label { private bool mGrowing; public GrowLabel() { this.AutoSize = false; } private void resizeLabel() { if (mGrowing) return; try { mGrowing = true; int width = this.Parent == null ? this.Width : this.Parent.Width; Size sz = new Size(this.Width, Int32.MaxValue); sz = TextRenderer.MeasureText(this.Text, this.Font, sz, TextFormatFlags.WordBreak); this.Height = sz.Height + Padding.Bottom + Padding.Top; } finally { mGrowing = false; } } protected override void OnTextChanged(EventArgs e) { base.OnTextChanged(e); resizeLabel(); } protected override void OnFontChanged(EventArgs e) { base.OnFontChanged(e); resizeLabel(); } protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); resizeLabel(); } } 

int width = this.Parent == null ? this.Width : this.Parent.Width; esto le permite utilizar la etiqueta de crecimiento automático cuando está acoplado a un elemento principal, por ejemplo, un panel.

this.Height = sz.Height + Padding.Bottom + Padding.Top; aquí nos ocupamos de relleno para arriba y para abajo.

  1. Coloque la etiqueta dentro de un panel
  2. Maneje el ClientSizeChanged event para el panel, haciendo que la etiqueta llene el espacio:

     private void Panel2_ClientSizeChanged(object sender, EventArgs e) { label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000); } 
  3. Establezca Auto-Size para la etiqueta como true

  4. Configure el Dock para que la etiqueta se Fill

No estoy seguro de que se ajuste a todos los casos de uso, pero a menudo utilizo un truco simple para obtener el comportamiento de ajuste: coloque su Label con TableLayoutPanel AutoSize=false dentro de un TableLayoutPanel 1×1 que se ocupará del tamaño de la Label .

Establezca la propiedad AutoEllipsis en ‘TRUE’ y la propiedad AutoSize en ‘FALSE’.

enter image description here

enter image description here

Si su panel está limitando el ancho de su etiqueta, puede configurar la propiedad Anchor de su etiqueta a la Izquierda, Derecha y establecer AutoSize en verdadero. Esto es conceptualmente similar a escuchar el evento SizeChanged del Panel y actualizar SizeChanged la etiqueta a un new Size(((Control)sender).Size.Width, 0) como lo sugirió una respuesta previa . Cada lado enumerado en la propiedad Ancla está, así, anclado al lado interno respectivo del Control. Entonces, enumerar dos lados opuestos en Anchor establece efectivamente la dimensión del control. El anclaje a la izquierda y a la derecha establece la propiedad Ancho del control y el Anclaje a la parte superior e inferior establecería su propiedad Altura.

Esta solución, como C #:

 label.Anchor = AnchorStyles.Left | AnchorStyles.Right; label.AutoSize = true; 

Si realmente desea establecer el ancho de la etiqueta independientemente del contenido, creo que la forma más fácil es la siguiente:

  • Establecer autosize verdadero
  • Establezca el ancho máximo de la forma en que lo desee
  • Establecer el ancho mínimo de forma idéntica

Ahora la etiqueta tiene un ancho constante, pero se adapta automáticamente a su altura.

Luego, para texto dynamic, disminuya el tamaño de la fuente. Si es necesario, use este fragmento en el sub en el que se establece el texto de la etiqueta:

 If Me.Size.Height - (Label12.Location.Y + Label12.Height) < 20 Then Dim naam As String = Label12.Font.Name Dim size As Single = Label12.Font.SizeInPoints - 1 Label12.Font = New Font(naam, size) End If 

Esto me ayudó en mi formulario llamado InpitWindow: en Designer for Label:

 AutoSize = true; Achors = Top, Left, Right. private void InputWindow_Shown(object sender, EventArgs e) { lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left - btOK.Margin.Right - lbCaption.Margin.Right - lbCaption.Margin.Left, Screen.GetWorkingArea(this).Height / 2); this.Height = this.Height + (lbCaption.Height - btOK.Height - btCancel.Height); //Uncomment this line to prevent form height chage to values lower than initial height //this.MinimumSize = new Size(this.MinimumSize.Width, this.Height); } //Use this handler if you want your label change it size according to form clientsize. private void InputWindow_ClientSizeChanged(object sender, EventArgs e) { lbCaption.MaximumSize = new Size(this.ClientSize.Width - btOK.Width - btOK.Margin.Left * 2 - btOK.Margin.Right * 2 - lbCaption.Margin.Right * 2 - lbCaption.Margin.Left * 2, Screen.GetWorkingArea(this).Height / 2); } 

Todo el código de mi formulario

Si las dimensiones del botón deben mantenerse sin cambios:

 myButton.Text = "word\r\nwrapped" 

La respuesta simple para este problema es cambiar la propiedad DOCK de la etiqueta. Es “NINGUNO” por defecto.

Use style="overflow:Scroll" en la etiqueta como en el siguiente HTML. Esto agregará la barra de desplazamiento en la etiqueta dentro del panel.