Pregunta

¿Cómo podemos obtener la funcionalidad de ajuste de palabras para una etiqueta en Formularios de Windows ?

Coloqué una etiqueta en un panel y agregué texto para etiquetar dinámicamente. Pero supera la longitud del panel. ¿Cómo puedo resolver esto?

¿Fue útil?

Solución

La respuesta rápida: desactiva AutoSize .

El gran problema aquí es que la etiqueta no cambiará su altura automáticamente (solo el ancho). Para obtener este derecho, 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 deberá configurar ResizeRedraw bandera de estilo en el constructor.

Otros consejos

En realidad, la respuesta aceptada es innecesariamente complicada.

Si establece la etiqueta en AutoSize, crecerá automáticamente con el texto que ingrese. (Esto incluye el crecimiento vertical.)

Si desea hacer que la palabra se ajuste a un ancho particular, puede establecer la propiedad MaximumSize.

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

Probado y funciona.

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

Malas noticias: no hay una propiedad autowrap.

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

Podría lograr esto mediante programación para dimensionarlo dinámicamente, pero aquí está la solución más sencilla:

  • Seleccione las propiedades de la etiqueta
  • AutoSize = True
  • MaximumSize = ( Width , Height ) donde Width = tamaño máximo que desea que tenga la etiqueta y Height = cuántos píxeles desea que envuelva

    Propiedades de muestra

De MSDN , Ajustar 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();
    }
}

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

Tenga una mejor basada 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 usar la etiqueta de crecimiento automático cuando se acopla a un padre, por ejemplo. un panel.

this.Height = sz.Height + Padding.Bottom + Padding.Top; aquí nos encargamos del relleno para la parte superior e inferior.

  1. Coloque la etiqueta dentro de un panel
  2. Maneja el evento ClientSizeChanged para el panel, haciendo que etiqueta rellena 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 en true

  4. Establezca Dock para la etiqueta en Fill

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

Establezca la propiedad AutoEllipsis en 'TRUE' y la propiedad AutoSize en 'FALSE'.

 ingrese la descripción de la imagen aquí

 ingrese la descripción de la imagen aquí

Si su panel está limitando el ancho de su etiqueta, puede establecer la propiedad de anclaje de su etiqueta en Izquierda, Derecha y establecer Tamaño automático en verdadero. Conceptualmente, es similar a escuchar el evento SizeChanged del Panel y actualizar el tamaño máximo de la etiqueta a un nuevo Tamaño (((Control) Sender) .Size.Width, 0) como se sugiere por una respuesta anterior . Cada lado listado en la propiedad Ancla está, bueno, anclado al lado interno respectivo del Control que contiene. Por lo tanto, listar dos lados opuestos en Anchor establece efectivamente la dimensión del control. El anclaje a la izquierda y la derecha establece la propiedad Ancho del control y el anclaje a la parte superior e inferior establecerá su propiedad de Altura.

Esta solución, como C #:

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

Si realmente quieres establecer el ancho de la etiqueta independientemente del contenido, encuentro que la forma más fácil es esta:

  • Establecer tamaño automático verdadero
  • Establezca el ancho máximo a su gusto
  • Establecer el ancho mínimo de forma idéntica

Ahora la etiqueta es de ancho constante, pero adapta su altura automáticamente.

Luego, para el texto dinámico, disminuya el tamaño de la fuente. Si es necesario, use este fragmento de código en el subcomité donde 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 para 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);
}

Código completo 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 " NONE " por defecto.

Use style = " overflow: Desplácese " en la etiqueta como se muestra en el HTML a continuación. Esto agregará la barra de desplazamiento en la etiqueta dentro del panel.

<asp:Label
    ID="txtAOI"
    runat="server"
    style="overflow:Scroll"
    CssClass="areatext"
    BackColor="White"
    BorderColor="Gray"
    BorderWidth="1"
    Width = "900" ></asp:Label>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top