WPF TextBox не заповнює StackPanel


94

У мене є 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елемент управління, я просто збентежений щодо макета.

Відповіді:


146

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

Для імітації бажаного ефекту можна використовувати a 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. :)
Зак Джонсон,

Серйозно, це за задумом? Здається дивним, оскільки сам контроль, очевидно, охоплює всю ширину. Ви хочете сказати, що область вмісту не обов’язково збігається з видимою?
Хенк,

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>

Горизонтально заповнюючи стекпанель


Так, але не в горизонтальній панелі стеків; ваш вертикальний :-)
JB. З Монікою.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.