2010-09-17 120 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" />