silverlight stackpanel

Silverlight: extendiéndose al espacio restante en StackPanel



(4)

Bueno, ya encontraste la solución;) StackPanels no rellenará ningún espacio restante de forma predeterminada porque su tamaño siempre es 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.

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?

<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 esto funcionó usando un contenedor de Grid:

<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>


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 requerido combinado de sus elementos secundarios". Eso es exactamente lo que sucede, pero este no es el resultado esperado.

Puedo ver 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 de Alineación horizontal, que si se selecciona debería hacer que el panel de pila llene 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>

Es solo cuando Orientación = "Horizontal" que el tamaño del niño horizontal se descompone.

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


Puedes usar un DockPanel . Establezca el primer elemento en el dock top y el segundo en el dock fill, o use la propiedad LastChildFill :

<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>


Use Columnas UniformGrid = "2" en lugar de StackPanel.