Pergunta

Como podemos obter a funcionalidade de quebra de linha para uma etiqueta em Windows Forms ?

Eu coloquei um rótulo em um painel e acrescentou algum texto para rotular dinamicamente. Mas excede o comprimento do painel. Como posso resolver isso?

Foi útil?

Solução

A resposta rápida: interruptor off AutoSize .

O grande problema aqui é que o rótulo não vai mudar a sua altura automaticamente (somente largura). Para obter este direito você precisará subclasse o rótulo e incluir lógica de redimensionamento vertical.

Basicamente o que você precisa fazer em OnPaint é:

  1. Medir a altura do texto (Graphics.MeasureString).
  2. Se a altura da etiqueta não é igual à altura do texto definir a altura e retorno.
  3. Desenhe o texto.

Você também precisará definir o ResizeRedraw bandeira do estilo no construtor.

Outras dicas

Na verdade, a resposta aceita é desnecessariamente complicado.

Se você definir o rótulo para AutoSize, ela vai crescer automaticamente com qualquer texto que você colocar nele. (Isto inclui o crescimento vertical.)

Se você quiser torná-lo quebra de linha em uma largura particular, você pode definir a propriedade MaximumSize.

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

testado e funciona.

No meu caso (etiqueta em um painel) Eu definir label.AutoSize = false e label.Dock = Fill. E o texto do rótulo é enrolado automaticamente.

Más notícias:. Não é uma propriedade Autowrap

Boa notícia: há uma luz no fim do túnel

Você pode fazer isso por meio de programação ao tamanho dinamicamente, mas aqui é a solução mais fácil:

  • Selecione as propriedades da etiqueta
  • AutoSize = True
  • MaximumSize = ( Largura , Altura ), onde Largura = tamanho máximo que você quer o rótulo de ser e Altura = quantos pixels você quer que embrulhe

    Propriedades de Amostra

A partir MSDN , automaticamente Moldar texto na 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();
    }
}

Eu tive que encontrar uma solução rápida, então eu só usei uma caixa de texto com essas propriedades:

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

Tenha um melhor com base em @hypo 's resposta

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; isso permite que você use etiqueta auto-grow quando acoplado a um pai, por exemplo, um painel.

this.Height = sz.Height + Padding.Bottom + Padding.Top; aqui nós cuidamos de preenchimento para cima e em baixo.

  1. Coloque o rótulo dentro de um painel
  2. Lidar com o ClientSizeChanged event para o painel, tornando o etiqueta preencher o espaço:

    private void Panel2_ClientSizeChanged(object sender, EventArgs e)
    {
        label1.MaximumSize = new Size((sender as Control).ClientSize.Width - label1.Left, 10000);
    }
    
  3. Set Auto-Size para o rótulo para true

  4. Set Dock para o rótulo para Fill

Não tenho certeza que vai caber todos os casos de uso, mas muitas vezes eu uso um truque simples para obter o comportamento de acondicionamento: colocar o seu Label com AutoSize=false dentro de um TableLayoutPanel 1x1 que vai cuidar do tamanho do Label.

Defina a AutoEllipsis propriedade para 'TRUE' e AutoSize propriedade para 'False'.

enter descrição da imagem aqui

enter descrição da imagem aqui

Se o seu painel é limitar a largura da sua etiqueta, você pode definir Anchor propriedade do seu rótulo para esquerda, direita e conjunto de AutoSize como true. Esta é conceitualmente similar à escuta de evento SizeChanged do Painel e atualizar MaximumSize do rótulo para um new Size(((Control)sender).Size.Width, 0) como sugerido por uma anterior resposta . Cada lado listado na propriedade da âncora é, assim, ancoradas ao respectivo lado interior da contendo de controlo. Então, listando dois lados opostos em Anchor efetivamente define a dimensão do controle. Ancoragem para a esquerda e conjuntos direito de propriedade Largura do Controle e ancoragem Superior e Inferior iria definir sua propriedade Height.

Esta solução, como C #:

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

Se você realmente quer para definir o rótulo de largura independente do conteúdo, acho que a maneira mais fácil é esta:

  • Set dimensionamento automático true
  • Definir largura máxima de como você quer que ele
  • Definir largura mínima idêntica

Agora, o rótulo é de largura constante, mas ele se adapta a sua altura automaticamente.

Depois de texto dinâmico, diminuir o tamanho da fonte. Se necessário, use esse trecho na sub onde o texto do rótulo é definido:

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

Isso me ajudou no meu formulário chamado InpitWindow: Em 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 inteiro da minha forma

Se as dimensões da necessidade botão para ser mantida inalterada:

myButton.Text = "word\r\nwrapped"

A resposta simples para esse problema é para alterar a propriedade Dock of the Label. É "NONE" por padrão.

Use style="overflow:Scroll" no rótulo como no abaixo HTML. Isto irá adicionar a barra de rolagem na etiqueta dentro do painel.

<asp:Label
    ID="txtAOI"
    runat="server"
    style="overflow:Scroll"
    CssClass="areatext"
    BackColor="White"
    BorderColor="Gray"
    BorderWidth="1"
    Width = "900" ></asp:Label>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top