WPF TextBox不会填写StackPanel


94

我有一个TextBox控件,StackPanelOrientation设置为Horizontal,但是无法获取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>

这是它的样子:

替代文字

为什么该TextBox无法填充StackPanel?

我知道我可以通过使用Grid控件来拥有更多控件,我只是对布局感到困惑。

Answers:


146

我对遇到同样的问题StackPanel,其行为是“设计使然”。 StackPanel用于在可见区域之外“堆叠”东西,因此它不允许您填充堆叠维度中的剩余空间。

您可以使用DockPanelwith LastChildFill设置为,true并将所有非填充控件停靠到,Left以模拟所需的效果。

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

7
需要澄清的是-默认将LastChildFill设置为“ True”,并且将Horizo​​ntalAlignment设置为TextBox的拉伸无效。:-)
哥布林

1
@哥布林:是的...我复制并粘贴了OP的代码,但忘了删除HorizontalAlignment。:)
Zach Johnson

说真的,这是设计使然?似乎很奇怪,因为控件本身显然跨越了整个宽度。您是说内容区域不一定与可见区域相同吗?
汉克,2010年

1
@peter没有WPF的东西做的很长一段时间,但你可以尝试某种与第一列组栅极占用的可用空间(stackoverflow.com/questions/12432189/...
扎克-约翰逊

6
我在这里参加聚会有点晚了,但是@peter:您可以FlowDirection="RightToLeft"在上使用DockPanel,这样您的最后一个孩子将成为剩下的孩子,并使用剩余的空间。
丹尼斯

16

我建议改用网格:

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

2

按实际主题划分的旧问题:

HorizontalAlignment="Stretch"

是必需的东西。请确保您删除width


1

我可以使用以下文本框填充StackPanel:

<StackPanel Margin="5,5,5,5">
    <Label Content = "lblExample" Width = "70" Padding="0" HorizontalAlignment="Left"/>
    <TextBox Name = "txtExample" Text = "Example Text" HorizontalContentAlignment="Stretch"/>
</StackPanel>

文本框水平填充Stackpanel


是的,但不是在水平的Stackpanel中; 您是垂直的:-)
JB。和莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.