Silverlight: растягивание до оставшегося пространства в StackPanel

у меня есть вертикальная 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>

обратите внимание, что я получил это для работы с помощью контейнера сетки:

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

4 ответов


Ну, вы уже нашли решение ;) StackPanels не будет заполнять оставшееся пространство по умолчанию, потому что их размер всегда равен объединенному требуемому размеру их дочерних элементов. Grid-отличный способ, потому что он будет динамически изменять размер при изменении размера браузера. Ответ марка на использование DockPanel тоже отлично работает. Единственный другой метод-вручную изменять размер элементов при изменении размера родительского элемента управления. Вообще до конца, ручка с решетками для наружного макет и они заполняют их с StackPanels и другие элементы управления, и вы должны быть установлены.


можно использовать DockPanel. Установите первый элемент в dock top, а второй-в Dock fill или используйте 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>

Я согласен с замечанием Джеймса, что " StackPanels по умолчанию не заполнит оставшееся пространство, потому что их размер всегда равен объединенному требуемому размеру их дочерних элементов.- Именно так и происходит, но это не ожидаемый результат.

Я понимаю, почему эта инструкция сжимает содержимое в наименьшее необходимое пространство.

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

однако... StackPanel принимает аргумент HorizontalAlignment , который при выборе должен вызвать панель стека для заполнения содержимого родительского контейнера. Это именно то, что происходит, когда вы устанавливаете Orientation="Vertical". Обратите внимание, что в этом случае StackPanel определит, сколько горизонтального пространства доступно и выделено дочерним элементам управления.

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

его только тогда, когда ориентация= "горизонтальная", что горизонтальный дочерний размер ломается.

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

используйте столбцы UniformGrid= " 2 " вместо StackPanel.