2009-07-07 5 views
39

Ho uno StackPanel verticale con due elementi: un Button e un ListBox. Come posso allungare la ListBox all'altezza restante della pagina?Silverlight: allunga allo spazio rimanente in 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> 

Nota che ho avuto questo lavoro utilizzando un contenitore griglia:

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

risposta

40

Beh, hai già trovato la soluzione;) StackPanels non riempire qualsiasi spazio rimanente per default, perché la loro dimensione è sempre uguale alla dimensione richiesta combinata dei loro elementi figli. La griglia è un ottimo modo per andare perché ridimensiona dinamicamente quando cambia la dimensione del browser. La risposta di Mark sull'utilizzo di un DockPanel funziona bene. L'unico altro metodo sarebbe quello di ridimensionare manualmente gli elementi quando le dimensioni del controllo genitore cambiano. In generale, attenersi alle griglie per il layout esterno e riempire con StackPanels e altri controlli e si dovrebbe essere impostato.

20

È possibile utilizzare un DockPanel. Impostare il primo elemento di attraccare in alto e la seconda di attraccare riempimento oppure usa la proprietà 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> 
+0

Grazie per la risposta. Un leggero "problema" è che DockPanel non è disponibile (ancora?) Per impostazione predefinita e che è necessario il Toolkit di Silverlight. Trovo strano però che sebbene la griglia fornisca un'altezza = "*" (prendi spazio rimanente/aggiungi tesa), una semplice StackPanel non lo fa. –

+0

Ho trovato il DockPanel la soluzione migliore qui perché avevo 2 datagrids all'interno di un ScrollViewer e questa è l'unica cosa che ha funzionato. – Rodney

+0

+1 per LastChildFill = "True" – sean717

15

Sono d'accordo con l'osservazione di James che "StackPanels non riempirà lo spazio rimanente di default perché la loro dimensione è sempre uguale alla dimensione richiesta combinata dei loro elementi figli." Questo è esattamente ciò che accade, ma questo non è il risultato atteso.

Posso capire perché questa istruzione comprime il contenuto nel più piccolo spazio necessario.

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

Tuttavia ... StackPanel accetta un argomento HorizontalAlignment - che, se selezionato dovrebbe causare il pannello pila per riempire il contenuto del contenitore principale. Questo è esattamente ciò che accade quando imposti Orientamento = "Verticale". Osservare che in questo caso lo StackPanel determinerà la quantità di spazio orizzontale disponibile e lo assegnerà ai controlli figlio. solo

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

sua quando Orientamento = "orizzontale" che il bambino orizzontale dimensionamento si rompe.

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

Al momento sto anche lottando con questo (sto usando comunque WPF). Impostazione Orientamento = "Orizzontale" su StackPanel in qualche modo impedisce di allungare con HorizontalAlignment = "Stretch". – aks

+3

Mi sono imbattuto in questo ... sembra un insetto più di ogni altra cosa. – porges

2

Utilizzare colonne UniformGrid = "2" anziché StackPanel.