2009-07-07 10 views
39

Tengo un StackPanel vertical con dos elementos: un Botón y un ListBox. ¿Cómo puedo hacer que ListBox se extienda a la altura de la página restante?Silverlight: se extiende al espacio restante en StackPanel

<StackPanel Height="Auto" Width="Auto"> 
    <Button Height="30" Width="100" Content="Get Content" x:Name="GetContent"/> 
    <ListBox Height="Auto" Width="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/> 
</StackPanel> 

Tenga en cuenta que llegué que esto funcione utilizando un recipiente aislado:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Button Width="100" Height="30" Content="Get Content" Click="OnGetContent" Grid.Row="0" Grid.Column="0"/> 
    <data:DataGrid x:Name="MyContent" Margin="0,5" Grid.Row="1" Grid.Column="0"/> 
</Grid> 

Respuesta

40

Bueno, que ya encontró la solución;) StackPanels no se llena cualquier espacio restante por defecto porque su tamaño es siempre igual al tamaño requerido combinado de sus elementos secundarios. Grid es una excelente forma de hacerlo porque cambiará el tamaño dinámicamente cuando cambie el tamaño del navegador. La respuesta de Mark de usar un DockPanel también funciona bien. El único otro método sería dimensionar manualmente los elementos cuando cambie el tamaño del control principal. En general, mantén las Grids para el diseño externo y las llenan con StackPanels y otros controles, y deberías configurarlo.

20

Puede utilizar un DockPanel. Establecer el primer elemento de muelle superior y el segundo para atracar relleno o bien utiliza el LastChildFill propiedad:

<toolkit:DockPanel LastChildFill="True" 
xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit">  
    <Button DockPanel.Dock="Top" Height="30" Width="100" 
    Content="Get Content" x:Name="GetContent"/> 
    <ListBox Background="Azure" /> 
</toolkit:DockPanel> 
+0

Gracias por la respuesta. Un ligero "problema" es que el DockPanel no está disponible (¿todavía?) De forma predeterminada y que necesita el kit de herramientas de Silverlight. Sin embargo, me parece extraño que aunque la Grilla proporciona una funcionalidad de Altura = "*" (tome el espacio restante/agregue estirado), un simple StackPanel no lo hace. –

+0

Encontré el DockPanel la mejor solución aquí ya que tenía 2 datagrids dentro de un Scrollviewer y esto es lo único que funcionó. – Rodney

+0

+1 para LastChildFill = "True" – sean717

15

Estoy de acuerdo con la observación de James de que "StackPanels no rellenará ningún espacio restante de forma predeterminada porque su tamaño siempre es igual al tamaño combinado requerido de sus elementos secundarios". Eso es exactamente lo que sucede, pero este no es el resultado esperado.

Entiendo por qué esta instrucción comprimiría los contenidos en el espacio necesario más pequeño.

<StackPanel Height="Auto" Width="Auto"> 

Sin embargo ... StackPanel acepta un argumento HorizontalAlignment - lo que si es seleccionado debe hacer que el panel de pila para llenar el contenido de su contenedor principal. Esto es exactamente lo que sucede cuando configura Orientación = "Vertical". Observe que, en este caso, StackPanel determinará cuánto espacio horizontal está disponible y lo asignará a los controles secundarios.

<StackPanel Height="30" Orientation="Vertical" HorizontalAlignment="Stretch" > 
    <TextBox /> <!--TextBox fills entire space--> 
</StackPanel> 

Su sólo cuando Orientación = "horizontal" que el niño Horizontal dimensionamiento se rompe.

<StackPanel Height="30" Orientation="Horizontal" HorizontalAlignment="Stretch" > 
    <TextBox /> <!--TextBox fills smallest space available--> 
</StackPanel> 
+2

También estoy luchando con esto en este momento (aunque estoy usando WPF). La configuración de Orientation = "Horizontal" en StackPanel de alguna manera evita que se estire con HorizontalAlignment = "Stretch". – aks

+3

Acabo de toparme con esto ... parece un error más que nada. – porges

2

Utilice UniformGrid Columns = "2" en lugar de StackPanel.

Cuestiones relacionadas