Como mantenho um rótulo centralizado no WinForms?


137

Em WinFormsEu estou usando um Labelpara exibir diferentes mensagens como sucesso, fracasso, etc.

Gostaria de centralizar esse rótulo no formulário central. Quero uma solução que a mantenha centralizada, se houver apenas uma palavra ou uma frase inteira no rótulo.

Respostas:


281

Defina Labela AutoSizepropriedade de False, TextAlignpropriedade de MiddleCentere Dockpropriedade de Fill.


graças decyclone, funcionou. você pode guiar o que o Dock faz?
haansi

3
Com a Control.Dockpropriedade ( msdn.microsoft.com/en-us/library/… ), você pode encaixar (colar) um controle em um determinado lado do contêiner. Por exemplo Left, Top, Rightou Bottom. Fillinforma ao controle para ocupar todo o espaço disponível no contêiner.
decyclone

1
A menos que você queira que o rótulo preencha todo o espaço disponível para ele, convém definir a propriedade Dock como "None", conforme sugerido pelo usuário3866622 em sua solução programática.
Tim

3
Funcionou, mas não precisei fazer nada no Dockcenário.
Jim caiu

4
Dockconfiguração era desnecessária. Alterar a AutoSizepropriedade fornece ao rótulo uma caixa delimitadora na qual você pode ajustar manualmente o tamanho.
Nick Roberts

13

Algum conteúdo adicional secundário para configuração programaticamente:

Label textLabel = new Label() { 
        AutoSize = false, 
        TextAlign = ContentAlignment.MiddleCenter, 
        Dock = DockStyle.None, 
        Left = 10, 
        Width = myDialog.Width - 10
};            

O alinhamento entre o estilo das docas e o conteúdo pode diferir das suas necessidades. Por exemplo, para um rótulo simples em um formulário wpf, uso DockStyle.None.



10

Se você não deseja encaixar o rótulo em toda a área disponível, basta definir o evento SizeChanged em vez de TextChanged. A alteração de cada letra altera a propriedade width do label e o texto quando a propriedade de dimensionamento automático é definida como True. Portanto, a propósito, você pode usar qualquer fórmula para manter o rótulo centralizado no formulário.

private void lblReport_SizeChanged(object sender, EventArgs e)
{
    lblReport.Left = (this.ClientSize.Width - lblReport.Size.Width) / 2;
}

2

A resposta aceita não funcionou para mim por dois motivos:

  1. Eu tinha BackColordefinido isso AutoSize = falsee Dock = Fillfaz com que a cor do plano de fundo preencha todo o formulário
  2. Eu não poderia ter AutoSizedefinido como falso de qualquer maneira, porque o texto do meu marcador era dinâmico

Em vez disso, simplesmente usei a largura do formulário e a largura do rótulo para calcular o deslocamento esquerdo:

MyLabel.Left = (this.Width - MyLabel.Width) / 2;

1

Eu queria fazer algo semelhante, mas em um formulário com uma imagem de plano de fundo, descobri que, quando o texto no rótulo era alterado, as repetições eram óbvias com esse método, então fiz o seguinte: * Defina o tamanho automático do rótulo como true e TextAlign como MiddleCenter

Então, toda vez que o texto mudava (o meu era feito usando um timer), chamei o seguinte método:

    private Point GetPosition()
    {
        int y = (this.Height / 2) - (label1.Height / 2);
        int x = (this.Width / 2) - (label1.Width / 2);
        return new Point(x, y);
    }

E defina a propriedade Location do rótulo para esse valor de retorno. Isso garantiu que o rótulo estivesse sempre no centro do formulário quando o texto foi alterado e as alterações de novo para um formulário em tela cheia não eram óbvias.


1

Você pode experimentar o seguinte snippet de código:

private Point CenterOfMenuPanel<T>(T control, int height=0) where T:Control {
    Point center = new Point( 
        MenuPanel.Size.Width / 2 - control.Width * 2,
        height != 0 ? height : MenuPanel.Size.Height / 2 - control.Height / 2);

    return center;
}

É realmente centro

insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.