2009-07-07 2 views
39

У меня есть вертикальная StackPanel с двумя элементами: Button и ListBox. Как я могу растянуть ListBox на оставшуюся высоту страницы?Silverlight: растягивается до оставшегося пространства в 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> 

ответ

40

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

20

Вы можете использовать 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> 
+0

Спасибо за ответ. Небольшая проблема заключается в том, что DockPanel недоступен (пока?) По умолчанию и вам нужен Silverlight Toolkit. Мне показалось странным, хотя, хотя Grid действительно обеспечивает высоту = «*» (использовать оставшееся пространство/добавить растянутую), простой StackPanel этого не делает. –

+0

Я нашел DockPanel лучшим решением здесь, так как у меня было 2 datagrids внутри Scrollviewer, и это единственное, что сработало. – Rodney

+0

+1 для LastChildFill = "True" – sean717

15

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

Я тоже борюсь с этим в данный момент (я использую WPF, хотя). Настройка Orientation = «Horizontal» на StackPanel каким-то образом предотвращает ее растяжение с помощью HorizontalAlignment = «Stretch». – aks

+3

Я просто столкнулся с этим ... кажется, что это больше, чем что-либо. – porges

2

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

Смежные вопросы