WPF TextBox ne remplira pas StackPanel

94

J'ai un TextBoxcontrôle dans un StackPaneldont Orientationest défini sur Horizontal, mais je ne peux pas faire en sorte que la zone de texte remplisse l'espace StackPanel restant.

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>

Et voici à quoi ça ressemble:

texte alternatif

Pourquoi cette TextBox ne remplit-elle pas le StackPanel?

Je sais que je peux avoir plus de contrôle en utilisant un Gridcontrôle, je suis juste confus au sujet de la mise en page.

Hank
la source

Réponses:

146

J'ai eu le même problème avec StackPanel, et le comportement est "par conception". StackPanelest destiné à «empiler» des objets même en dehors de la zone visible, il ne vous permettra donc pas de remplir l'espace restant dans la dimension d'empilement.

Vous pouvez utiliser un DockPanelavec LastChildFilljeu pour trueet arrimer tous les contrôles non-remplissage à Leftsimuler l'effet que vous voulez.

<DockPanel Background="Orange" LastChildFill="True">
    <TextBlock Text="a label" Margin="5" 
        DockPanel.Dock="Left" VerticalAlignment="Center"/>
    <TextBox Height="25" Width="Auto"/>
</DockPanel >
Zach Johnson
la source
7
Juste pour clarifier - LastChildFill est défini par défaut sur "True" et définir HorizontalAlignment pour s'étirer pour la zone de texte n'a aucun effet. :-)
Goblin
1
@Goblin: Oui ... J'ai copié et collé le code de l'OP mais j'ai oublié de le supprimer HorizontalAlignment. :)
Zach Johnson
Sérieusement, c'est par conception? Cela semble étrange, car le contrôle lui-même couvre évidemment toute la largeur. Êtes-vous en train de dire que la zone de contenu n'est pas nécessairement la même que la zone visible?
Hank le
1
@peter n'a pas fait de trucs wpf depuis longtemps, mais vous pouvez essayer une sorte de grille avec la première colonne définie pour occuper l'espace disponible ( stackoverflow.com/questions/12432189/… )
Zach Johnson
6
Je suis un peu en retard à la fête ici, mais @peter: vous pouvez utiliser FlowDirection="RightToLeft"le DockPanel, donc votre dernier enfant sera celui de gauche, en utilisant l'espace restant.
Dennis
16

Je recommanderais plutôt d'utiliser une grille:

<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'autre moyen de contourner ce problème consiste à empiler l'étiquette sur le dessus plutôt que sur la droite. J'ai remarqué qu'UWP a une propriété d'en-tête intégrée que vous pouvez utiliser pour cela, je ne sais pas si la propriété d'en-tête existe pour WPF.

<TextBox Header="MyLabel" />
Bill Moore
la source
2

Ancienne question par sujet actuel:

HorizontalAlignment="Stretch"

est la chose requise. Assurez-vous simplement de supprimer le fichier width.

glihm
la source
1

Je suis capable de remplir un StackPanel avec une zone de texte en utilisant ce qui suit:

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

Zone de texte Remplissage horizontal du panneau de pile

Ben
la source
Ouais mais pas dans un panneau horizontal; le vôtre est vertical :-)
JB. Avec Monica.