web-dev-qa-db-fra.com

Silverlight: étirement vers l'espace restant dans StackPanel

J'ai un StackPanel vertical avec deux éléments: un Button et un ListBox. Comment puis-je étirer la ListBox à la hauteur de page 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>

Notez que je l'ai fait fonctionner avec un conteneur 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>
39
Randy Voet

Eh bien, vous avez déjà trouvé la solution;) StackPanels ne remplira aucun espace restant par défaut car leur taille est toujours égale à la taille combinée requise de leurs éléments enfants. La grille est une excellente façon de procéder, car elle se redimensionne dynamiquement lorsque la taille du navigateur change. La réponse de Mark à l'utilisation d'un DockPanel fonctionne également très bien. La seule autre méthode serait de dimensionner manuellement les éléments lorsque la taille du contrôle parent change. En général, restez avec des grilles pour la disposition extérieure et remplissez-les avec StackPanels et d'autres contrôles et vous devriez être défini.

40
James Cadd

Vous pouvez utiliser un DockPanel. Définissez le premier élément à ancrer le haut et le second à ancrer le remplissage, ou utilisez la propriété 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>
20
Mark Heath

Je suis d'accord avec l'observation de James selon laquelle "StackPanels ne remplira aucun espace restant par défaut car leur taille est toujours égale à la taille requise combinée de leurs éléments enfants." C'est exactement ce qui se passe, mais ce n'est pas le résultat attendu.

Je peux voir pourquoi cette instruction compresserait le contenu dans le plus petit espace nécessaire.

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

Cependant ... StackPanel accepte un argument HorizontalAlignment - qui, s'il est sélectionné, devrait obliger le panneau de pile à remplir le contenu de son conteneur parent. C'est exactement ce qui se produit lorsque vous définissez Orientation = "Vertical". Notez que dans ce cas, le StackPanel déterminera la quantité d'espace horizontal disponible et l'allouera aux contrôles enfants.

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

Ce n'est que lorsque Orientation = "Horizontal" que le dimensionnement horizontal de l'enfant tombe en panne.

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

Utilisez UniformGrid Columns = "2" au lieu de StackPanel.

2
BSalita