2009-09-24 18 views
8

.NET Framework/C#/Windows FormsFlowLayoutPanel autowrapping no funciona con tamaño automático

Me gustaría que el FlowLayoutPanel para ajustar automáticamente su anchura o altura dependiendo del número de controles dentro de ella. También debe cambiar el número de columnas/filas si no hay suficiente espacio (ajustar su contenido). El problema es que si configuro autosize, el panel flowlayout no ajusta los controles que inserté. ¿Qué solución es la mejor?

Gracias!

+0

Me sorprende que nadie haya respondido a esta, estoy teniendo el mismo problema. ¿Bache? – echo

+1

El TableLayoutPanel puede ser una mejor solución para usted: tiene soporte integrado para columnas y filas de tamaño automático, así como tamaño automático para todo el panel. – Bevan

Respuesta

0

¿Está agregando los controles dinámicamente basándose en las acciones del usuario? Me temo que necesitarías cambiar las propiedades de FlowLayout sobre la marcha en el código, al agregarle nuevos controles, entonces refrescar el formulario sería suficiente.

1

¿Ha intentado utilizar TableLayoutPanel? Es muy útil para colocar controles dentro de las celdas.

1

No existe tal cosa como imposible en el desarrollo de software. Imposible simplemente toma más tiempo.

He investigado el problema. Si realmente se necesita Flow Layout, se puede hacer con un poco de trabajo. Dado que FlowLayoutPanel establece los controles sin tener en cuenta particularmente el número de filas/columnas, sino más bien el ancho/alto acumulativo, es posible que deba realizar un seguimiento de la cantidad de controles que ya ha agregado. En primer lugar, establezca el autosize en falso, luego enganche su propia lógica de administración de tamaño a los eventos ControlAdded/ControlRemoved. La idea es establecer la anchura y altura del panel de tal manera, que usted va a obtener su número deseado de 'columnas' allí

prueba de concepto sucio:

private void flowLayoutPanel1_ControlAdded(object sender, ControlEventArgs e) 
    { 
     int count = this.flowLayoutPanel1.Controls.Count; 
     if (count % 4 == 0) 
     { 
      this.flowLayoutPanel1.Height = this.flowLayoutPanel1.Height + 70; 
     } 
    } 

si el panel tiene inicialmente ancho para 4 controles, generará fila para los nuevos. El controlador ControlRemoved debería verificar lo mismo y disminuir la altura del panel, o obtener todos los controles contenidos y colocarlos de nuevo. Deberías pensarlo, puede que no sea el tipo de cosa que quieres. Depende de los escenarios de uso. ¿Todos los controles serán del mismo tamaño? Si no, necesitarías una lógica más complicada.

Pero realmente, piense en el diseño de la tabla: puede envolverlo en una clase auxiliar o derivar un nuevo control de él, donde resolvería toda la lógica de colocación de control. FlowLayout facilita agregar y eliminar controles, pero luego ingresa el código de administración de tamaños. TableLayout le ofrece un buen mecanismo para filas y columnas, administrar el ancho y alto es más fácil, pero necesitaría más código para cambiar la ubicación de todos controles si desea eliminar uno de forma dinámicamente.

1

Si es posible, sugiero que cambie el tamaño del FlowLayoutPanel para que haga uso de todo el ancho disponible y luego anclarlo en la parte superior, izquierda y derecha. Esto debería hacer que crezca en altura según sea necesario mientras sigue envolviendo los controles.

+1

¿Pero cómo le dice al 'FlowLayoutPanel' que actualice automáticamente su propiedad' Height' en función de cuántas líneas ha necesitado crear al envolver el contenido? Me gusta la idea de anclar Arriba, Izquierda y Derecha, pero el 'Alto' de mi' FlowLayoutPanel' todavía parece permanecer constante ... – binki

2

Establezca el MaximumSize de FlowLayoutPanel en el ancho que desee que abarque. Establecer WrapContents = verdadero.

+0

establecer el tamaño máximo aún necesita cálculo – Smith

Cuestiones relacionadas