2009-07-07 13 views
39

Ich habe eine vertikale StackPanel mit zwei Elementen: eine Schaltfläche und eine ListBox. Wie kann ich die ListBox auf die verbleibende Seitenhöhe strecken?Silverlight: Ausdehnung auf verbleibenden Platz 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> 

Bitte beachte, dass ich diese an die Arbeit ein Grid-Container mit:

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

Antwort

40

Nun, Sie fanden die Lösung bereits;) StackPanels nicht füllen alle verbleibenden Raum standardmäßig, weil ihre Größe ist immer gleich der kombinierten erforderlichen Größe ihrer Kindelemente. Grid ist eine gute Möglichkeit, da es sich dynamisch ändert, wenn sich die Browsergröße ändert. Marks Antwort auf ein DockPanel funktioniert auch. Die einzige andere Methode wäre, die Elemente manuell zu vergrößern, wenn sich die Größe des übergeordneten Steuerelements ändert. Im Allgemeinen bleiben Sie bei Grids für das äußere Layout und sie füllen sie mit StackPanels und anderen Steuerelementen und Sie sollten eingestellt werden.

20

Sie können eine DockPanel verwenden. Stellen Sie den ersten Punkt oben andocken und die zweite Füllung andocken, oder verwenden Sie die LastChildFill Eigenschaft:

<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

Danke für die Antwort. Ein kleines "Problem" besteht darin, dass das DockPanel standardmäßig (noch nicht) verfügbar ist und Sie das Silverlight Toolkit benötigen. Ich finde es merkwürdig, obwohl das Grid eine Height = "*" -Funktionalität bietet (nehmen Sie verbleibenden Platz/hinzugefügt gestreckt), was ein einfaches StackPanel nicht tut. –

+0

Ich fand das DockPanel die beste Lösung hier, da ich 2 Datagrids in einem Scrollviewer hatte und das ist die einzige Sache, die funktionierte. – Rodney

+0

+1 für LastChildFill = "True" – sean717

15

Ich stimme James 'Beobachtung zu, dass "StackPanels keinen verbleibenden Platz standardmäßig füllen wird, da ihre Größe immer der kombinierten erforderlichen Größe ihrer Kindelemente entspricht." Genau das passiert, aber das ist nicht das erwartete Ergebnis.

Ich kann sehen, warum diese Anweisung den Inhalt in den kleinsten notwendigen Raum komprimieren würde.

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

jedoch ... Stackpanel übernimmt eine Horizontal Argument - die, wenn ausgewählt wird, sollte der Stapel-Display verursachen, den Inhalt ihrer übergeordneten Container zu füllen. Genau das passiert, wenn Sie Ausrichtung = "Vertikal" festlegen. Beachten Sie, dass das StackPanel in diesem Fall bestimmt, wie viel horizontaler Speicherplatz verfügbar ist, und es den untergeordneten Steuerelementen zuweist.

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

Seine nur, wenn Orientation = "Horizontal", dass die horizontale Kind bricht Sizing.

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

Ich kämpfe auch im Moment mit diesem (ich benutze WPF obwohl). Die Einstellung "Orientation =" Horizontal "auf StackPanel verhindert irgendwie, dass es sich mit HorizontalAlignment =" Stretch "ausdehnt. – aks

+3

Ich bin einfach reingerannt ... es scheint mehr als alles andere ein Fehler zu sein. – porges

2

Verwenden Sie UniformGrid Columns = "2" anstelle von StackPanel.

Verwandte Themen