¿Cómo mantengo una etiqueta centrada en WinForms?

137

En WinFormsEstoy usando a Labelpara mostrar diferentes mensajes como éxito, fracaso, etc.

Me gustaría centrar esa etiqueta en el formulario central. Quiero una solución que lo mantenga centrado, ya sea que haya una sola palabra o una oración completa en la etiqueta.

haansi
fuente

Respuestas:

281

Establezca Labella AutoSizepropiedad en False, TextAlignpropiedad en MiddleCentery Dockpropiedad en Fill.

deciclón
fuente
gracias decyclone, funcionó. ¿Puedes guiarme por lo que hace Dock?
haansi
3
Con la Control.Dockpropiedad ( msdn.microsoft.com/en-us/library/… ), puede acoplar (pegar) un control a un cierto lado del contenedor. Por ejemplo Left, Top, Righto Bottom. Fillle dice al control que tome todo el espacio disponible en el contenedor.
Decyclone
1
A menos que desee que la etiqueta llene todo el espacio disponible, puede establecer la propiedad Dock en "Ninguno" como lo sugiere el usuario 3866622 en su solución programática.
Tim
3
Funcionó, pero no necesitaba hacerle nada al Dockentorno.
Jim Fell
44
DockLa configuración era innecesaria. Cambiar la AutoSizepropiedad le da a la etiqueta un cuadro delimitador que puede ajustar manualmente el tamaño.
Nick Roberts el
13

Algunos contenidos adicionales menores para configurar mediante programación:

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

La alineación de Dockstyle y Content puede diferir de sus necesidades. Por ejemplo, para una etiqueta simple en un formulario wpf, uso DockStyle.None.

usuario3866622
fuente
12

Lo logrará estableciendo la propiedad Anchor: None.

Sebastian Xawery Wiśniowiecki
fuente
10

Si no desea acoplar la etiqueta en toda el área disponible, simplemente configure el evento SizeChanged en lugar de TextChanged. Cambiar cada letra cambiará la propiedad de ancho de la etiqueta, así como su texto cuando la propiedad de tamaño automático esté establecida en Verdadero. Entonces, por cierto, puede usar cualquier fórmula para mantener la etiqueta centrada en la forma.

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

La respuesta aceptada no funcionó para mí por dos razones:

  1. Lo BackColorconfiguré AutoSize = falsey Dock = Fillhace que el color de fondo llene todo el formulario
  2. De AutoSizetodos modos, no podría haber establecido en falso porque el texto de mi etiqueta era dinámico

En cambio, simplemente usé el ancho del formulario y el ancho de la etiqueta para calcular el desplazamiento izquierdo:

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

Quería hacer algo similar, pero en un formulario con una imagen de fondo, descubrí que cuando el texto en la etiqueta cambiaba, los repintes eran obvios con este método, así que hice lo siguiente: * Establecer la etiqueta AutoSize en true y TextAlign en MiddleCenter

Luego, cada vez que el texto cambiaba (el mío se hacía usando un temporizador) llamé al siguiente 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);
    }

Y establezca la propiedad Ubicación de la etiqueta en este valor de retorno. Esto aseguró que la etiqueta siempre estaba en el centro del formulario cuando el texto cambiaba y los repintes para un formulario de pantalla completa no eran obvios.

LordPupazz
fuente
1

Puede probar el siguiente fragmento 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;
}

Es realmente centro

ingrese la descripción de la imagen aquí

Scott Yu
fuente