Pregunta

Algunos controles de 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, los (multilínea) TextBox y el ListBox Parecen más preocupados por ocupar sólo el espacio necesario para que quepan sus contenidos, y nada más.

Si pones a estos tipos en una celda en un UniformGrid, se expandirán para adaptarse al espacio disponible.Sin embargo, UniformGrid Los casos no son adecuados para todas las situaciones.¿Qué sucede 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, a Listy un Button, ¿cómo se puede conseguir que la lista ocupe todo el espacio que no ocupa la etiqueta y el botón?

Creo que esto sería realmente un requisito de diseño básico, pero no sé cómo lograr que llenen el espacio que podrían (colocarlos en un DockPanel y configurarlo para llenar tampoco funciona, al parecer, ya que el DockPanel solo ocupa el espacio que necesitan sus subcontroles).

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

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

¿Fue útil?

Solución

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 se representa cada control

El último hijo del DockPanel llena el espacio restante.Puede desactivar este comportamiento configurando el LastChild propiedad a false.

El StackPanel Pregunta a cada niño cuál es el tamaño deseado y luego los apila.El panel de pila llama Measure() en cada niño, con una talla disponible de Infinity y luego utiliza el tamaño deseado por el niño.

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

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

Ver Este artículo para un ejemplo sencillo.

Otros consejos

También hay algunas propiedades que puede configurar para forzar que un control llene su espacio disponible cuando de otro modo no lo haría.Por ejemplo, puedes decir:

HorizontalContentAlignment="Stretch"

...para forzar que el contenido de un control se estire horizontalmente.O puedes decir:

HorizontalAlignment="Stretch"

...para forzar que el control se estire horizontalmente para llenar su padre.

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

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

En el DockPanel, había acoplado cosas en el orden incorrecto.Si TextBox o ListBox es el único elemento acoplado sin alineación, o si son los últimos agregados, llenarán el espacio restante según se desee.

Me encantaría ver un método más elegante para manejar esto, pero servirá.

Utilizar el Alineación horizontal y Alineamiento vertical propiedades de diseño.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 espacio sobrante.Las propiedades de alineación controlan lo que hace el elemento hijo con el espacio extra.

El valor predeterminado para ambas propiedades es Estirar, por lo que el elemento secundario se estira para llenar todo el espacio disponible.Las opciones adicionales incluyen Izquierda, Centro y Derecha para Alineación horizontal y Superior, Centro e Inferior para Alineamiento vertical.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top