2012-03-01 26 views
43

¿Hay alguna manera de realizar un ajuste de palabras en un control de etiqueta .NET?Envoltura de etiquetas de etiquetas

Sé que hay una forma alternativa de utilizar un TextBox, hacer de la propiedad BorderStyle a ninguno, propiedad de sólo lectura a la propiedad real y establecer WordWrap y la propiedad Multiline true.

¿Hay algo para una etiqueta?

+0

No creo que haya, pero ha pasado bastante tiempo desde que hice WinForms. –

Respuesta

19

Consulte Automatically Wrap Text in Label. Describe cómo crear su propia etiqueta en crecimiento.

Aquí es la fuente completa tomada de la referencia anterior:

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(); 
    } 
} 
+0

Estoy tratando de agregar una nueva propiedad a la etiqueta existente, como AutoSize, algo así como IsWordWrap = true. ¿Alguna idea? para que pueda dar LabelName.IsWordWrap = verdadero; – Sharpeye500

+0

TextRenderer.MeasureText en mi caso dio un tamaño incorrecto. Para que todo sea perfecto, también debe anular OnPaint y dibujar texto como este: 'TextRenderer.DrawText (e.Graphics, this.Text, this.Font, new Rectangle (0, 0, this.Width, Int32.MaxValue), ForeColor, TextFormatFlags.WordBreak); ' – user1561713

132

Cambiar el tamaño máximo,

label1.MaximumSize = new Size(100, 0); 

y establecer su tamaño automático en true.

label1.AutoSize = true; 

Eso es todo!

+1

Es posible que necesite' using System.Drawing; 'también. – Appulus

+6

Esta debería ser la respuesta aceptada – Nissim

+0

Estoy de acuerdo, esta es la mejor y más fácil de implementar, simplemente la he probado y funciona perfectamente – nizx

15

Irónicamente, apagar AutoSize estableciéndolo en false me permitió obtener las dimensiones de control etiqueta al tamaño que tanto verticalmente y horizontalmente que efectivamente permite palabra-envoltura que se produzca.

28

Simplemente establezca la propiedad Label AutoSize en False. Luego, el texto se ajustará y podrá cambiar el tamaño del control manualmente para mostrar el texto.

3

Si quieres un poco de ajuste dinámico del tamaño junto con una etiqueta de palabra de ajuste que puede hacer lo siguiente:

  1. poner la etiqueta dentro de un panel
  2. manija del ClientSizeChanged event para el panel, haciendo que el etiqueta de llenar el espacio:

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

  4. Conjunto Dock que la etiqueta Fill
4

Si abre el menú desplegable para la propiedad Text en Visual Studio, puede utilizar la tecla Intro para dividir líneas. Obviamente, esto solo funcionará para texto estático a menos que conozca las dimensiones máximas del texto dinámico.

+0

Gracias! Esto es exactamente lo que estaba buscando (cómo dividir líneas en el diseñador). – ehambright

+0

montones mejor respuesta! –

-2

Se puede utilizar un TextBox y establecer multiline a true y canEdit a false.

+0

multiline y canEdit no son propiedades reales en TextBox. –