2009-07-07 14 views
39

İki elemanlı bir dikey StackPanel var: a Button ve bir ListBox. ListBox germesini kalan sayfa yüksekliğine nasıl alabilirim? Bu varSilverlight: StackPanel'de kalan alana uzanan

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

Note Izgara kabını kullanarak çalışmak için:

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

cevap

40

Eh, zaten çözümü buldum; onların büyüklük olduğundan StackPanels varsayılan olarak kalan boşluğu doldurmak olmaz) Her zaman çocuk elemanlarının gerekli olan büyüklüğüne eşittir. Grid, tarayıcı boyutu değiştiğinde dinamik olarak yeniden boyutlandırılacağı için gitmek için harika bir yoldur. Mark'ın DockPanel kullanmanın cevabı da iyi. Diğer tek yöntem, ana denetimin boyutu değiştiğinde öğeleri el ile boyutlandırmak olabilir. Genel olarak, dış düzen için Izgaralar ile sopa ve bunları StackPanels ve diğer kontrollerle doldururlar ve ayarlanmalıdır.

20

Bir DockPanel kullanabilirsiniz. top yerleştirmek için ilk öğeyi ayarlayın ve ikinci dolguyu sabitlemek veya LastChildFill özelliğini kullanmak için:

<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

Cevabınız için teşekkürler. Hafif bir 'problem', DockPanel'in varsayılan olarak mevcut olmadığı ve Silverlight Toolkit'e ihtiyaç duyduğudur. Grid, bir Height = "*" (kalan alan/gergin ekle) işlevselliği sağlamasına rağmen, basit bir StackPanel'in yapmasına rağmen, garip buluyorum. –

+0

Burada bir Scrollviewer içinde 2 datagrids vardı ve burada çalışan tek şey olduğu gibi DockPanel en iyi çözüm bulundu. LastChildFill = "True" için – Rodney

+0

+1 = "True" – sean717

15

James'in gözlemine katılıyorum: "StackPanels varsayılan olarak kalan alanı doldurmaz, çünkü boyutları her zaman için çocuk öğelerinin gerekli boyutuna eşittir." Bu tam olarak ne olur, ama beklenen sonuç bu değil.

Bu talimatın içeriği neden en küçük gerekli alana sıkıştıracağını anlayabiliyorum.

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

... Ancak StackPanel bir HorizontalAlignment bağımsız değişken kabul - seçilmiş ise yığın paneli, üst kabın içindekileri dolmasına neden gereken. Oryantasyon = "Dikey" olarak ayarlandığında tam olarak bu gerçekleşir. Bu durumda StackPanel'in ne kadar yatay alanın mevcut olduğunu ve çocuk kontrollerine tahsis edeceğini gözlemleyin.

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

Onun sadece Oryantasyon = "Yatay" aşağı sonları boyutlandırma Yatay çocuk.

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

Ben de şu anda bununla mücadele ediyorum (WPF kullanıyorum). Yönlendirme Ayarı = StackPanel üzerinde "Yatay" bir şekilde HorizontalAlignment = "Stretch" ile gerilmesini önler. – aks

+3

Sadece bununla karşılaştım ... her şeyden çok bir böcek gibi görünüyor. – porges

2

UniformGrid Columns = StackPanel yerine "2" kullanın.