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

У меня есть вертикальная StackPanel с двумя элементами: Button и ListBox. Как я могу растянуть ListBox на оставшуюся высоту страницы?

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

Ответ 1

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

Ответ 2

Вы можете использовать DockPanel. Установите первый элемент для док-станции сверху, а второй для заполнения док-станции, или используйте свойство 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>

Ответ 3

Я согласен с замечанием Джеймса, что "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>

Ответ 4

Используйте UniformGrid Columns = "2" вместо StackPanel.