WPF TextBox nie wypełni StackPanel


95

Mam TextBoxformant w ramach, StackPanelktórego Orientationjest ustawiona na Horizontal, ale nie mogę uzyskać TextBox, aby wypełnić pozostałą przestrzeń 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>

A tak to wygląda:

tekst alternatywny

Dlaczego ten TextBox nie wypełnia StackPanel?

Wiem, że mogę mieć większą kontrolę, używając Gridkontrolki, jestem po prostu zdezorientowany co do układu.

Odpowiedzi:


147

Miałem ten sam problem StackPaneli zachowanie jest „zgodne z projektem”. StackPaneljest przeznaczony do "układania" rzeczy nawet poza widocznym obszarem, więc nie pozwoli ci wypełnić pozostałej przestrzeni w wymiarze układania.

Możesz użyć DockPanelz LastChildFillustawieniem truei zadokować wszystkie elementy sterujące niewypełnianiem do, Leftaby zasymulować żądany efekt.

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

7
Dla wyjaśnienia - LastChildFill jest domyślnie ustawione na „True”, a ustawienie HorizontalAlignment na stretch dla TextBox nie daje żadnego efektu. :-)
Goblin

1
@Goblin: Tak ... Skopiowałem i wkleiłem kod OP, ale zapomniałem go usunąć HorizontalAlignment. :)
Zach Johnson

Poważnie, to jest zamierzone? Wydaje się to dziwne, ponieważ sama kontrolka oczywiście obejmuje całą szerokość. Czy chcesz powiedzieć, że obszar zawartości niekoniecznie jest taki sam jak obszar widoczny?
Hank

1
@peter od dawna nie robił rzeczy związanych z wpf, ale możesz wypróbować jakąś siatkę z pierwszą kolumną ustawioną tak, aby zajmowała dostępne miejsce ( stackoverflow.com/questions/12432189/ ... )
Zach Johnson

6
Trochę się spóźniłem na imprezę tutaj, ale @peter: możesz użyć FlowDirection="RightToLeft"na DockPanel, więc Twoje ostatnie dziecko będzie lewe, wykorzystując pozostałą przestrzeń.
Dennis

16

Poleciłbym zamiast tego użyć siatki:

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

Innym sposobem obejścia tego problemu jest ułożenie etykiety na górze zamiast po prawej stronie. Zauważyłem, że UWP ma wbudowaną właściwość nagłówka, której możesz użyć do tego, nie jestem pewien, czy właściwość nagłówka istnieje dla WPF.

<TextBox Header="MyLabel" />

2

Stare pytanie według aktualnego tematu:

HorizontalAlignment="Stretch"

jest wymagana. Tylko pamiętaj, aby usunąć plik width.


1

Jestem w stanie wypełnić StackPanel polem tekstowym, korzystając z:

<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 wypełniający poziomo pole tekstowe


Tak, ale nie w poziomym panelu podłogowym; twój jest pionowy :-)
JB. Z Monicą.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.