2011-09-27 26 views
9

Estoy creando un elemento de panel plegable, que esencialmente sería un elemento de panel con un elemento de botón y un elemento de panel debajo del botón. Al hacer clic en el botón, el panel vecino tendrá Visible = false. Me gustaría cambiar el tamaño del panel que lo contiene cuando el panel secundario está configurado como invisible.Cambiar el tamaño del panel para que se ajuste a los elementos de las ventanas

he hecho esto manualmente, estableciendo la propiedad Size a ser la suma de las anchuras y alturas de los elementos visibles (ya sea el botón o el botón y el panel secundario.)

Tengo curiosidad por saber aunque si había una manera de forzar el cambio de tamaño del panel contenedor sin llamar manualmente al Size.

Supongo que estoy buscando la inversa de la propiedad Dock=Fill, que cambia automáticamente el tamaño de los elementos en función del tamaño de su elemento contenedor.

Gracias de antemano.

+0

creo que lo es. Tal vez puedas usar el FlowLayoutPanel para ajustar automáticamente los paneles dentro de su área de cliente, pero creo que lo que estás haciendo es correcto. – mhttk

+0

¿Cuál es el punto de cambiar el tamaño cuando nadie puede verlo? –

+0

@ Hans Passant: Lo siento, la pregunta puede haber sido redactada de manera extraña. Hay dos paneles. Uno es el que se vuelve invisible, y el otro contiene el botón y el panel invisible. El panel externo necesita contraerse cuando el panel interior se vuelve invisible, de lo contrario no se está colapsando, simplemente está desapareciendo pero ocupando el mismo espacio que solía hacerlo. Intentaba hacer algo similar a lo que ve en Visual Studio Forms Toolbox cuando expande y contrae, por ejemplo, la parte "Controles comunes". – user420667

Respuesta

8

¿Qué hacer:

panel1.Size = new Size(0, 0); 
panel1.AutoSize = true; 

y luego en vez de cambiar la visibilidad, hacer esto:

panel1.Controls.Remove(panel2); 

y cuando usted quiere traer de vuelta:

panel1.Controls.Add(panel2); 

(panel1 es el panel posterior)

+1

Gran pensamiento. Entonces AutoSize era la propiedad que estaba buscando. Lo único es que esto debe ser seguido por un panel2.BringToFront() o arrojará la orden de acoplamiento. – user420667

4

Acabo de probar la respuesta dada por ispiro. Usted no necesita quitar y agregar el control. El ajuste Visible puede funcionar. Depende de cuándo se realiza el diseño. Si panel2 realiza el diseño antes del panel1, panel2 no cambiará de tamaño. Para hacerlo más fácil, use los padres PerformLayout en su lugar.

Es utilizado como esto:

panel1.ResumeLayout(false); 
panel2.ResumeLayout(false); 
this.ResumeLayout(false); 
this.PerformLayout(); 
Cuestiones relacionadas