¿Cómo obtener controles en WPF para llenar el espacio disponible?


Algunos controles WPF (como el Button) parecen consumir felizmente todo el espacio disponible en su contenedor si no especifica la altura que debe tener.

Y algunos, como los que necesito usar ahora mismo, el (multilínea) TextBox y el ListBox parecen más preocupados por tomar el espacio necesario para adaptarse a sus contenidos, y no más.

Si pones a estos tipos en una celda en un UniformGrid, se expandirán para adaptarse al espacio disponible. Sin embargo, UniformGrid las instancias no son adecuadas para todos situación. ¿Qué pasa si tiene una cuadrícula con algunas filas configuradas en una altura * para dividir la altura entre ella y otras filas*? ¿Qué pasa si tienes un StackPanel y tienes un Label, un Listy un Button, ¿cómo puedes conseguir que la lista ocupe todo el espacio no consumido por la etiqueta y el botón?

Creo que esto sería realmente un requisito de diseño básico, pero no puedo averiguar cómo conseguir que llenen el espacio que podrían (ponerlos en un DockPanel y configurarlo para llenar también no funciona, es parece, ya que el DockPanel solo ocupa el espacio necesario por sus subcontroles).

Una GUI redimensionable sería bastante horrible si tuvieras que jugar con Height, Width, MinHeight, MinWidth etc.

¿Puedes enlazar tus propiedades Height y Width a la celda de cuadrícula que ocupas? O hay otra manera de hacer esto?

Author: lokusking, 2008-08-30

4 answers

Cada control derivado de Panel implementa una lógica de diseño distinta realizada en Measure() y Arrange():

  • Measure() determina el tamaño del panel y cada uno de sus hijos
  • Arrange() determina el rectángulo donde cada control representa

El último hijo de la DockPanel llena el espacio restante. Puede desactivar este comportamiento estableciendo la propiedad LastChild en false.

El StackPanel pide a cada niño su deseado tamaño y luego los apila. El panel pila llama a Measure() en cada hijo, con un tamaño disponible de Infinity y luego usa el tamaño deseado del hijo.

A Grid ocupa todo el espacio disponible, sin embargo, establecerá a cada niño en su tamaño deseado y luego los centrará en la celda.

Puede implementar su propia lógica de diseño derivando de Panel y luego reemplazando MeasureOverride() y ArrangeOverride().

Ver este artículo para un ejemplo sencillo.

 140
Author: user3837,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-17 12:41:12

También hay algunas propiedades que puede establecer para forzar a un control a llenar su espacio disponible cuando de otra manera no lo haría. Por ejemplo, puedes decir:

HorizontalContentAlignment="Stretch"

... forzar el contenido de un control a estirarse horizontalmente. O puedes decir:

HorizontalAlignment="Stretch"

... forzar el propio control a estirarse horizontalmente para llenar su padre.

 198
Author: Matt Hamilton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-31 04:34:37

Bueno, lo descubrí yo mismo, justo después de postear, que es la forma más embarazosa. :)

Parece que cada miembro de un StackPanel simplemente llenará su tamaño mínimo solicitado.

En el DockPanel, había atracado cosas en el orden equivocado. Si el cuadro de texto o ListBox es el único elemento acoplado sin alineación, o si son los últimos agregados, llenarán el espacio restante como se desee.

Me encantaría ver un método más elegante de manejar esto, pero lo hará hacer.

 14
Author: Rune Jacobsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-15 12:43:17

Utilice las propiedades de diseño HorizontalAlignmenty VerticalAlignment. Controlan cómo un elemento utiliza el espacio que tiene dentro de su padre cuando hay más espacio disponible del que requiere el elemento.

El ancho de un StackPanel, por ejemplo, será tan ancho como el elemento más ancho que contenga. Por lo tanto, todos los elementos más estrechos tienen un poco de exceso de espacio. Las propiedades de alineación controlan lo que el elemento hijo hace con el espacio adicional.

El valor predeterminado para ambas propiedades son Stretch, por lo que el elemento hijo se estira para llenar todo el espacio disponible. Las opciones adicionales incluyen Izquierda, Centro y Derecha para HorizontalAlignment y Superior, Centro e Inferior para VerticalAlignment.

 0
Author: urini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-31 10:24:05