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>
4 ответа
Что ж, вы уже нашли решение;) StackPanels не будет заполнять оставшееся пространство по умолчанию, потому что их размер всегда равен совокупному требуемому размеру их дочерних элементов. Сетка - отличный способ, потому что она будет динамически изменяться при изменении размера браузера. Ответ Марка об использовании DockPanel тоже работает отлично. Единственным другим методом будет изменение размеров элементов вручную при изменении размера родительского элемента управления. В общем, придерживайтесь гридов для внешнего макета, и они заполняют их StackPanels и другими элементами управления, и вы должны быть настроены.
Вы можете использовать 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>
Я согласен с замечанием Джеймса о том, что "StackPanels не будет заполнять оставшееся пространство по умолчанию, потому что их размер всегда равен совокупному требуемому размеру их дочерних элементов". Это именно то, что происходит, но это не ожидаемый результат.
Я понимаю, почему эта инструкция сжимает содержимое в наименьшее необходимое пространство.
<StackPanel Height="Auto" Width="Auto">
Однако... StackPanel принимает аргумент HorizontalAlignment, который при выборе должен заставить панель стека заполнять содержимое своего родительского контейнера. Это именно то, что происходит, когда вы устанавливаете Orientation="Vertical". Обратите внимание, что в этом случае StackPanel определит объем доступного горизонтального пространства и выделит его для дочерних элементов управления.
<StackPanel Height="30" Orientation="Vertical" HorizontalAlignment="Stretch" >
<TextBox /> <!--TextBox fills entire space-->
</StackPanel>
Только когда Orientation="Horizontal", горизонтальный дочерний размер нарушается.
<StackPanel Height="30" Orientation="Horizontal" HorizontalAlignment="Stretch" >
<TextBox /> <!--TextBox fills smallest space available-->
</StackPanel>