2010-09-17 119 views
63

我有一個TextBox控制StackPanelOrientation設置爲Horizontal,但無法讓文本框填充剩餘的StackPanel空間。WPF TextBox將不會填寫StackPanel

XAML:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="180" Width="324"> 

    <StackPanel Background="Orange" Orientation="Horizontal" > 
     <TextBlock Text="a label" Margin="5" VerticalAlignment="Center"/> 
     <TextBox Height="25" HorizontalAlignment="Stretch" Width="Auto"/> 
    </StackPanel> 
</Window> 

這是什麼樣子:

alt text

爲什麼那個文本框不填充StackPanel的?

我知道我可以通過使用控制Grid控制更多的控制,我只是對佈局感到困惑。

回答

107

我與StackPanel有同樣的問題,並且行爲是「按設計」。 StackPanel是爲了「堆疊」東西,甚至在可見區域之外,所以它不會讓您填充堆疊尺寸中的剩餘空間。

您可以使用DockPanelLastChildFill設置爲true和碼頭所有非填充控制到Left來模擬你想要的效果。

<DockPanel Background="Orange" LastChildFill="True"> 
    <TextBlock Text="a label" Margin="5" 
     DockPanel.Dock="Left" VerticalAlignment="Center"/> 
    <TextBox Height="25" Width="Auto"/> 
</DockPanel > 
+6

只是爲了澄清 - LastChildFill默認設置爲「True」並將Horizo​​ntalAlignment設置爲伸展TextBox沒有任何效果。 :-) – Goblin 2010-09-17 17:45:21

+0

@Goblin:是的......我複製並粘貼了OP的代碼,但忘了刪除'Horizo​​ntalAlignment'。 :) – 2010-09-17 18:06:32

+0

嚴重的是,這是由設計?似乎很奇怪,因爲控制本身顯然跨越整個寬度。您是否說內容區域不一定與可見區域相同? – 2010-09-17 18:34:08

1

我會建議使用網格來代替:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="180" Width="324"> 

    <Grid Background="Orange"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <TextBlock Grid.Column="0" Text="a label" 
      VerticalAlignment="Center"/> 
     <TextBox Grid.Column="1"/> 
    </Grid> 
</Window> 

另一種方式來解決這個問題是堆放在標籤上頂部,而不是右邊。我注意到UWP有一個內置的頭文件屬性,您可以使用它,不確定是否存在WPF的頭文件屬性。

<TextBox Header="MyLabel" />