WPF TextBox не заполнит StackPanel - PullRequest
       28

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

82 голосов
/ 17 сентября 2010

У меня есть 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, я просто запутался в макете.

Ответы [ 3 ]

127 голосов
/ 17 сентября 2010

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

<DockPanel Background="Orange" LastChildFill="True">
    <TextBlock Text="a label" Margin="5" 
        DockPanel.Dock="Left" VerticalAlignment="Center"/>
    <TextBox Height="25" Width="Auto"/>
</DockPanel >
11 голосов
/ 12 февраля 2018

Я бы порекомендовал использовать 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" />
0 голосов
/ 11 июля 2019

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

Текстовое поле горизонтально заполняющей панели стека

...