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 en este momento, el (multilínea) TextBox
y los ListBox
más preocupados por tomar el espacio necesario para adaptarse a sus contenidos, y nada más.
Si coloca a estos tipos en una celda en un UniformGrid
, se expandirán para adaptarse al espacio disponible. Sin embargo, las UniformGrid
instancias no son adecuadas para todas las situaciones. ¿Qué sucede si tiene una cuadrícula con algunas filas establecidas en * altura para dividir la altura entre sí y otras * filas? ¿Qué sucede si tiene una StackPanel
y tiene una Label
, una List
y una Button
, cómo puede obtener la lista para ocupar todo el espacio que no se come en la etiqueta y el botón?
Creo que esto realmente sería un requisito de diseño básico, pero no puedo entender cómo hacer que llenen el espacio que podrían (ponerlos en DockPanel
y configurarlo para llenar tampoco funciona, parece, ya que el DockPanel
solo ocupa el espacio que necesitan sus 'subcontroles').
Una interfaz gráfica de usuario de tamaño variable sería bastante horrible si había que jugar con Height
, Width
, MinHeight
, MinWidth
etc.
¿Puedes vincular tus Height
y Width
propiedades a la celda de la cuadrícula que ocupas? ¿O hay otra manera de hacer esto?
fuente
Respuestas:
Cada control derivado de
Panel
implementa una lógica de diseño distinta realizada enMeasure()
yArrange()
:Measure()
determina el tamaño del panel y cada uno de sus elementos secundariosArrange()
determina el rectángulo donde se representa cada controlEl último hijo de la
DockPanel
llena el espacio restante. Puede deshabilitar este comportamiento estableciendo laLastChild
propiedad enfalse
.La
StackPanel
pregunta a cada niño por su tamaño deseado y luego las pilas. El panel de pila llamaMeasure()
a cada niño, con un tamaño disponibleInfinity
y luego usa el tamaño deseado del niño.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 anulandoMeasureOverride()
yArrangeOverride()
.Vea este artículo para un ejemplo simple.
fuente
The last child of the DockPanel fills the remaining space
: esta fue la clave que faltaba a mi entender. Siempre pensé que el elemento sin Dock explícito llenaba el espacio.También hay algunas propiedades que puede configurar para forzar a un control a llenar su espacio disponible cuando de otro modo no lo haría. Por ejemplo, puedes decir:
... para forzar que el contenido de un control se estire horizontalmente. O puedes decir:
... para forzar el control mismo a estirarse horizontalmente para llenar su padre.
fuente
Bueno, lo descubrí yo mismo, justo después de publicar, que es la forma más vergonzosa. :)
Parece que cada miembro de un StackPanel simplemente llenará el tamaño mínimo requerido.
En el DockPanel, había acoplado las cosas en el orden incorrecto. Si TextBox o ListBox es el único elemento acoplado sin una alineación, o si son los últimos agregados, llenarán el espacio restante según lo deseado.
Me encantaría ver un método más elegante para manejar esto, pero servirá.
fuente
Utilice las propiedades de diseño HorizontalAlignment y VerticalAlignment . Controlan cómo un elemento usa el espacio que tiene dentro de su elemento primario cuando hay más espacio disponible del requerido por el elemento.
El ancho de un StackPanel, por ejemplo, será tan ancho como el elemento más ancho que contiene. Por lo tanto, todos los elementos más estrechos tienen un poco de espacio en exceso. 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 hijo 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 Alineación Vertical .
fuente