WPF TextBox не будет заполнять StackPanel

У меня есть элемент управления 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>

И вот что это выглядит:

alt text

Почему TextBox не заполняет StackPanel?

Я знаю, что я могу иметь больше контроля с помощью элемента управления Grid, меня просто путают в макете.

Ответ 1

У меня была такая же проблема с 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 >

Ответ 2

Вместо этого я рекомендую использовать Grid:

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

Ответ 3

Я могу заполнить 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>

Textbox Горизонтально Заполняющая Стеклопанель