WPF TextBox не заполняет StackPanel

96

У меня есть элемент TextBoxуправления, для StackPanelкоторого Orientationустановлено значение 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управления, меня просто смущает макет.

Хэнк
источник

Ответы:

148

У меня была такая же проблема StackPanel, и поведение "по замыслу". StackPanelпредназначен для «укладки» вещей даже за пределами видимой области, поэтому он не позволит вам заполнить оставшееся пространство в измерении наложения.

Вы можете использовать DockPanelс 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», а установка HorizontalAlignment на растяжение для TextBox не имеет никакого эффекта. :-)
Гоблин
1
@Goblin: Да ... Я скопировал и вставил код OP, но забыл удалить HorizontalAlignment. :)
Зак Джонсон
Серьезно, это задумано? Выглядит странно, поскольку элемент управления, очевидно, занимает всю ширину. Вы хотите сказать, что область содержимого не обязательно совпадает с видимой областью?
Hank
1
@peter уже долгое время не использует wpf, но вы можете попробовать какую-нибудь сетку с первым столбцом, который будет занимать доступное пространство ( stackoverflow.com/questions/12432189/… )
Зак Джонсон
6
Я немного опоздал на вечеринку, но @peter: вы можете использовать FlowDirection="RightToLeft"на DockPanel, поэтому ваш последний ребенок будет левым, используя оставшееся пространство.
Деннис
17

Я бы рекомендовал вместо этого использовать сетку:

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

Текстовое поле с горизонтальным заполнением панели стека

Бен
источник
Да, но не в горизонтальной стековой панели; ваш вертикальный :-)
JB. С Моникой.