sirve - visual studio wpf
¿Cómo obtener controles en WPF para llenar el espacio disponible? (4)
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 TextBox
(multilínea) y el ListBox
parecen más preocupados por tomar el espacio necesario para adaptarse a sus contenidos, y nada más.
Si coloca a estos individuos en una celda en un UniformGrid
, se expandirán para ajustarse al espacio disponible. Sin embargo, UniformGrid
instancias de UniformGrid
no son adecuadas para todas las situaciones. ¿Qué sucede si tiene una cuadrícula con algunas filas configuradas en una * altura para dividir la altura entre ellas y otras * filas? ¿Qué StackPanel
si tiene un StackPanel
y tiene una Label
, una List
y un Button
, cómo puede hacer que la lista ocupe todo el espacio que la etiqueta y el botón no comen?
Creo que esto realmente sería un requisito básico de diseño, pero no puedo encontrar la forma de hacer que llenen el espacio que podrían (ponerlos en un DockPanel
y configurarlo para que se llene tampoco funciona, parece, ya que DockPanel
solo ocupa el espacio que necesitan sus subcontroles).
Una GUI de tamaño variable sería bastante horrible si tuvieras que jugar con Height
, Width
, MinHeight
, MinWidth
, etc.
¿Puede unir sus propiedades de Width
y Width
a la celda de la cuadrícula que ocupa? ¿O hay otra manera de hacer esto?
Bueno, lo descubrí yo mismo, justo después de publicar, que es la forma más vergonzosa. :)
Parece que cada miembro de StackPanel simplemente llenará el tamaño mínimo solicitado.
En el DockPanel, había atracado las cosas en el orden equivocado. Si el cuadro de texto o el cuadro de lista es el único elemento acoplado sin una 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á.
Cada control derivado del Panel
implementa distintas lógicas de diseño realizadas en Measure()
y Arrange()
:
-
Measure()
determina el tamaño del panel y cada uno de sus hijos -
Arrange()
determina el rectángulo donde se procesa cada control
El último hijo de DockPanel
llena el espacio restante. Puede deshabilitar este comportamiento configurando la propiedad LastChild
en false
.
El StackPanel
le pide a cada niño el tamaño deseado y luego los apila. El panel de la pila llama a Measure()
en cada niño, con un tamaño disponible de Infinity
y luego usa el tamaño deseado del niño.
Una Grid
ocupa todo el espacio disponible, sin embargo, establecerá 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 del Panel
y luego anulando MeasureOverride()
y ArrangeOverride()
.
Vea este artículo para un ejemplo simple.
También hay algunas propiedades que puede configurar para forzar a un control a llenar su espacio disponible cuando de lo contrario no lo haría. Por ejemplo, puedes decir:
HorizontalContentAlignment="Stretch"
... forzar el contenido de un control para estirar horizontalmente. O puedes decir:
HorizontalAlignment="Stretch"
... forzar el propio control para estirarse horizontalmente para llenar su padre.
Utilice las propiedades de diseño HorizontalAlignment y VerticalAlignment . Controlan cómo un elemento utiliza el espacio que tiene dentro de su elemento primario cuando hay más espacio disponible del que necesita 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 en exceso. Las propiedades de alineación controlan lo que hace el elemento secundario con el espacio adicional.
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 HorizontalAlignment y Superior, Centro y Abajo para VerticalAlignment .