2009-01-29 29 views
105

Estoy tratando de centrar un control de tamaño fijo dentro de un formulario.Controles de centrado dentro de un formulario en .NET (Winforms)?

Fuera de interés, ¿hay una forma no idiota de hacer esto? Lo que realmente quiero es algo análogo a la propiedad text-align css.

Por el momento, estoy configurando la propiedad de relleno del formulario circundante a un tamaño adecuado y estableciendo la propiedad Dock del control para completar.

+0

solución simple [aquí] (http://stackoverflow.com/a/10786900/730701) – Adam

Respuesta

217

Puede lograr esto con el uso de los anclajes . O más precisamente, el sin uso de ellos.

Los controles están anclados por defecto en la parte superior izquierda del formulario, lo que significa que cuando se cambiará el tamaño del formulario, su distancia desde el lado superior izquierdo del formulario permanecerá constante. Si cambia el anclaje de control a la esquina inferior izquierda, el control mantendrá la misma distancia desde el lado inferior y el lado izquierdo del formulario cuando cambie el tamaño del formulario.

Al desconectar el anclaje en una dirección mantendrá el control centrado en esa dirección al cambiar el tamaño.

NOTA: Desactivación de anclaje a través de la ventana de propiedades en VS2015 puede requerir entrar Nada, Nada (en lugar de arriba por defecto, izquierda)

+0

Así, se podría colocar el control en el centro de la forma (aprox o exacta mediante el panel Propiedades), o en el controlador de eventos Form.Load, estableciendo las propiedades Control.Left, Control.Top con respecto al Control.Size y forma. Tamaño. – maxwellb

+0

Genial, nunca pensé en abandonar todos los lados en la propiedad Anchor, ahora si cambio el tamaño, el control se mantiene centrado. !¡estupendo! – FabianSilva

+1

Entonces, si coloco una etiqueta en un formulario en el centro y establezco su Anclaje en Ninguno, ¿por qué no se mantiene en el centro cuando se maximiza la ventana del formulario? – user1004959

84
myControl.Left = (this.ClientSize.Width - myControl.Width)/2 ; 
myControl.Top = (this.ClientSize.Height - myControl.Height)/2; 
+1

Creo que esta es la respuesta correcta para mantener realmente el control en el centro incluso cuando se cambia el tamaño del formulario en tiempo de ejecución. – user1004959

+13

Agregue el código anterior a un evento System.Windows.Forms.Form SizeChanged y listo. – Zignd

+0

Esto, junto con el evento SizeChanged del control que desea mantener centrada, es la solución para mantener el control de centrado si su control puede cambiar su tamaño, independientemente de su forma original. – Skyqula

1

Se trata de calcular visualmente (bueno supongo que se podría salir una calculadora y calcular) pero simplemente inserte dicho control en el formulario y luego elimine cualquier anclaje (ancla = Ninguno).

+0

¿Podría elborar? No puedo entender tu respuesta. –

+0

En mi intento de responder rápidamente (que siempre son vencidos por la mano en StackOverflow) que estaba diciendo lo que dijo el usuario splattne más elocuente: apagar el anclaje para el control desea centrar. – t3rse

+1

FYI, la barra de herramientas de diseño de Visual Studio tiene los botones "Centrar horizontalmente" y "Centrar verticalmente" que eliminan la necesidad de "mirar" cualquier cosa. No estoy seguro de si existía antes de VS2010, pero es bastante útil. – Dan

31

Puesto que usted no indica si el formulario se puede cambiar el tamaño o no hay una manera más fácil si no se preocupan por el cambio de tamaño (si lo hace la atención, va con solución de trigos Mitch):

Seleccione el control -> Formato (opción de menú) -> Centrar en ventana -> Horizontal o verticalmente

+2

¿Por qué la solución de mitch es mejor para redimensionar que anclar en el diseñador? –

+1

@EdSykes no es – HDD

+0

Sí ... funciona. Al usar su guía: - Seleccione control. Vaya a Formato -> Centrar en formulario -> Seleccione verticalmente y horizontalmente. Luego vaya a anclar, deseleccione Superior e Izquierda (anclaje de control predeterminado) ... y se centró en la pantalla ... enormemente – Luiey

8

Encontré una excelente manera de hacerlo y funcionará con múltiples controles. Agregue un TableLayout con 3 columnas. Haga que la columna central tenga un tamaño absoluto (sin importar cuánto espacio necesite). Establezca las dos columnas exteriores al 100%. Agregue un Panel a la columna central y agregue los controles que necesite y colóquelos donde desee. Ese panel central ahora permanecerá centrado en su forma.

+0

Muy bien, pero en algún momento establecer columna central a tamaño automático es más adecuado. – CoolMagic

+0

Un TableLayoutPanel de una sola celda que contiene un panel desacoplado también funciona bien. – Larry

2

Puede colocar el control que desea centrar dentro de un Panel y establecer los valores de relleno izquierdo y derecho en algo mayor que el valor predeterminado. Siempre que sean iguales y su control esté anclado a los lados del Panel, aparecerá centrado en ese Panel. Luego puede anclar el Panel contenedor a su principal según sea necesario.

+0

Para controles múltiples: coloque los controles en un panel y luego quite los anclajes del panel. –

-2

Propiedad superior e izquierda si la ventana primaria está maximizada.

1

Para centrar botón en el panel o en otro recipiente siga este paso:

  1. En tiempo de diseño fijar la posición
  2. ir a las características ancla del botón y establecer este valor la imagen de seguimiento
  3. como

enter image description here

0

puedes poner todos los controles al panel y luego escribir una código para mover su panel al centro de su formulario.

panelMain.Location = 
    new Point(ClientSize.Width/2 - panelMain.Size.Width/2, 
       ClientSize.Height/2 - panelMain.Size.Height/2); 

panelMain.Anchor = AnchorStyles.None; 
0

Además, si se desea alinear al centro de otra otro control:

//The "ctrlParent" is the one on which you want to align "ctrlToCenter". 
//"ctrlParent" can be your "form name" or any other control such as "grid name" and etc. 
ctrlToCenter.Parent = ctrlParent; 

ctrlToCenter.Left = (ctrlToCenter.Parent.Width - ctrlToCenter.Width)/2; 
ctrlToCenter.Top = (ctrlToCenter.Parent.Height - ctrlToCenter.Height)/2; 
Cuestiones relacionadas