WPF TextBox non riempirà StackPanel


94

Ho un TextBoxcontrollo all'interno di un StackPanelcui Orientationè impostato Horizontal, ma non riesco a far sì che il TextBox riempia lo spazio StackPanel rimanente.

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>

E questo è come appare:

testo alternativo

Perché quella casella di testo non riempie lo StackPanel?

So di poter avere più controllo utilizzando un Gridcontrollo, sono solo confuso sul layout.

Risposte:


146

Ho avuto lo stesso problema con StackPanele il comportamento è "di progettazione". StackPanelè pensato per "impilare" cose anche al di fuori della regione visibile, quindi non ti permetterà di riempire lo spazio rimanente nella dimensione di impilamento.

È possibile utilizzare a DockPanelcon LastChildFillimpostato su truee agganciare tutti i controlli non riempitivi a Leftper simulare l'effetto desiderato.

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

7
Giusto per chiarire - LastChildFill è impostato di default su "True" e l'impostazione di HorizontalAlignment per allungare per il TextBox non ha alcun effetto. :-)
Goblin

1
@Goblin: Sì ... ho copiato e incollato il codice dell'OP ma ho dimenticato di rimuoverlo HorizontalAlignment. :)
Zach Johnson,

Sul serio, questo è di progettazione? Sembra strano, dal momento che il controllo stesso copre ovviamente l'intera larghezza. Stai dicendo che l'area del contenuto non è necessariamente la stessa dell'area visibile?
Hank

1
@peter non ha fatto cose wpf da molto tempo, ma potresti provare una sorta di griglia con la prima colonna impostata per occupare lo spazio disponibile ( stackoverflow.com/questions/12432189/… )
Zach Johnson

6
Sono un po 'in ritardo per la festa qui, ma @peter: puoi usare FlowDirection="RightToLeft"su DockPanel, quindi il tuo ultimo figlio sarà quello a sinistra, usando lo spazio rimanente.
Dennis

16

Consiglierei invece di usare una griglia:

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

L'altro modo per aggirare questo problema è impilare l'etichetta in alto invece che a destra. Ho notato che UWP ha una proprietà di intestazione incorporata che puoi utilizzare per questo, non sono sicuro che la proprietà dell'intestazione esista per WPF.

<TextBox Header="MyLabel" />

2

Vecchia domanda per argomento attuale:

HorizontalAlignment="Stretch"

è la cosa richiesta. Assicurati di rimuovere il file width.


1

Sono in grado di riempire uno StackPanel con una casella di testo utilizzando quanto segue:

<StackPanel Margin="5,5,5,5">
    <Label Content = "lblExample" Width = "70" Padding="0" HorizontalAlignment="Left"/>
    <TextBox Name = "txtExample" Text = "Example Text" HorizontalContentAlignment="Stretch"/>
</StackPanel>

Casella di testo a riempimento orizzontale Stackpanel


Sì, ma non in un Stackpanel orizzontale; la tua è verticale :-)
JB. Con Monica.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.