WPF TextBox füllt StackPanel nicht aus

93

Ich habe eine TextBoxKontrolle in einem , StackPanelder Orientationist auf Horizontal, kann aber nicht die TextBox bekommt den verbleibende Raum Stackpanel zu füllen.

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>

Und so sieht es aus:

Alt-Text

Warum füllt diese TextBox das StackPanel nicht?

Ich weiß, dass ich mit einem GridSteuerelement mehr Kontrolle haben kann. Ich bin nur verwirrt über das Layout.

Strang
quelle

Antworten:

145

Ich hatte das gleiche Problem mit StackPanelund das Verhalten ist "beabsichtigt". StackPanelist zum "Stapeln" von Objekten auch außerhalb des sichtbaren Bereichs gedacht, sodass Sie den verbleibenden Platz in der Stapeldimension nicht ausfüllen können.

Sie können a DockPanelmit LastChildFillset to verwenden trueund alle nicht füllenden Steuerelemente an and andocken Left, um den gewünschten Effekt zu simulieren.

<DockPanel Background="Orange" LastChildFill="True">
    <TextBlock Text="a label" Margin="5" 
        DockPanel.Dock="Left" VerticalAlignment="Center"/>
    <TextBox Height="25" Width="Auto"/>
</DockPanel >
Zach Johnson
quelle
7
Nur zur Verdeutlichung: LastChildFill ist standardmäßig auf "True" gesetzt, und das Festlegen von HorizontalAlignment zum Strecken für die TextBox hat keine Auswirkung. :-)
Goblin
1
@Goblin: Ja ... Ich habe den OP-Code kopiert und eingefügt, aber vergessen, ihn zu entfernen HorizontalAlignment. :)
Zach Johnson
Im Ernst, das ist beabsichtigt? Scheint seltsam, da sich das Steuerelement selbst offensichtlich über die gesamte Breite erstreckt. Wollen Sie damit sagen, dass der Inhaltsbereich nicht unbedingt mit dem sichtbaren Bereich übereinstimmt?
Hank
1
@ Peter hat lange Zeit keine Wpf-Sachen gemacht, aber Sie könnten versuchen, eine Art Raster mit der ersten Spalte zu verwenden, um den verfügbaren Speicherplatz zu belegen ( stackoverflow.com/questions/12432189/… )
Zach Johnson
6
Ich bin ein bisschen zu spät zur Party hier, aber @peter: Sie können FlowDirection="RightToLeft"auf der verwenden DockPanel, so dass Ihr letztes Kind das linke ist und den verbleibenden Platz nutzt.
Dennis
15

Ich würde stattdessen die Verwendung eines Rasters empfehlen:

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

Die andere Möglichkeit, dieses Problem zu umgehen, besteht darin, das Etikett oben und nicht rechts zu stapeln. Ich habe festgestellt, dass UWP eine integrierte Header-Eigenschaft hat, die Sie dafür verwenden können. Ich bin mir nicht sicher, ob die Header-Eigenschaft für WPF vorhanden ist.

<TextBox Header="MyLabel" />
Bill Moore
quelle
2

Alte Frage nach aktuellem Thema:

HorizontalAlignment="Stretch"

ist das Erforderliche. Stellen Sie sicher, dass Sie das entfernen width.

glihm
quelle
1

Ich kann ein StackPanel mit einem Textfeld wie folgt füllen:

<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 Horizontal Füllen des Stackpanels

Ben
quelle
Ja, aber nicht in einem horizontalen Stapelpanel; deins ist vertikal :-)
JB. Mit Monica.