¿Cómo lograr que los hijos de StackPanel llenen el espacio máximo hacia abajo?

Simplemente quiero que fluya el texto a la izquierda y un cuadro de ayuda a la derecha.

La caja de ayuda debe extenderse hasta el fondo.

Si sacas el StackPanel externo a continuación, funciona muy bien.

Pero por razones de diseño (estoy insertando UserControls dinámicamente) necesito tener el envoltorio StackPanel.

¿Cómo hago para que GroupBox se extienda hasta la parte inferior del StackPanel, como puede ver, lo he intentado:

  • VerticalAlignment = “Stretch”
  • VerticalContentAlignment = “Estirar”
  • Altura = “Auto”

XAML:

            

Responder:

Gracias Mark, usando DockPanel en lugar de StackPanel, lo aclaró. En general, me encuentro usando DockPanel cada vez más para el diseño de WPF, aquí está el XAML fijo:

               

Parece que quieres un StackPanel donde el elemento final consume todo el espacio restante. Pero, ¿por qué no utilizar un DockPanel ? Decore los otros elementos en DockPanel con DockPanel.Dock="Top" , y luego su control de ayuda puede ocupar el espacio restante.

XAML:

  Something Something else          

Si se encuentra en una plataforma sin DockPanel disponible (por ejemplo, WindowsStore), puede crear el mismo efecto con una grilla. Aquí está el ejemplo anterior logrado utilizando cuadrículas en su lugar:

       Something Something else               

La razón por la que esto sucede es porque el panel de stack mide cada elemento secundario con infinito positivo como la restricción para el eje al que está astackndo los elementos. Los controles secundarios tienen que devolver el tamaño que desean tener (el infinito positivo no es un retorno válido de MeasureOverride en ninguno de los ejes) por lo que devuelven el tamaño más pequeño en el que todo encajará. No tienen manera de saber cuánto espacio tienen que llenar.

Si su vista no necesita tener una función de desplazamiento y la respuesta anterior no se ajusta a sus necesidades, le sugiero que implemente su propio panel. Probablemente puedas derivar directamente de StackPanel y luego todo lo que necesites hacer es cambiar el método ArrangeOverride para que divida el espacio restante entre sus elementos secundarios (dándoles a cada uno la misma cantidad de espacio extra). Los elementos deberían estar bien si se les da más espacio de lo que querían, pero si les das menos, comenzarás a ver problemas técnicos.

Si quieres poder desplazar todo, me temo que las cosas serán un poco más difíciles, porque ScrollViewer te da una cantidad infinita de espacio para trabajar, lo que te colocará en la misma posición que los elementos secundarios. originalmente. En esta situación, es posible que desee crear una nueva propiedad en su nuevo panel que le permita especificar el tamaño de la ventana gráfica, debería poder unir esto al tamaño del Visualizador de desplazamiento. Lo ideal es que implemente IScrollInfo , pero eso comienza a complicarse si va a implementar todo correctamente.

Un método alternativo es usar una cuadrícula con una columna yn filas. Establezca todas las alturas de filas en Auto y la altura de la fila inferior en 1* .

Prefiero este método porque he encontrado que las Rejillas tienen un mejor rendimiento de diseño que DockPanels, StackPanels y WrapPanels. Pero a menos que los esté usando en una plantilla de elemento (donde el diseño se realiza para una gran cantidad de elementos), probablemente nunca lo note.

Puede usar la versión modificada de StackPanel:

      

El primer botón se llenará.

Puedes instalarlo a través de Nuget:

 Install-Package SpicyTaco.AutoGrid 

También recomiendo echar un vistazo a wpf-autogrid . Es muy útil para formularios en WPF en lugar de DockPanel, StackPanel y Grid, y resuelve problemas con estiramientos de forma muy fácil y elegante. Solo mira el léame en github.