.net - tutorial - xaml




WPF TextBox ne remplira pas StackPanel (2)

J'ai un contrôle TextBox dans un StackPanel dont l' Orientation est Horizontal , mais ne peut pas obtenir le TextBox pour remplir 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:

Pourquoi ce TextBox ne remplit-il pas le StackPanel?

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


J'ai eu le même problème avec StackPanel , et le comportement est "par conception". StackPanel est destiné à "empiler" des choses même en dehors de la région visible, de sorte qu'il ne vous permettra pas de remplir l'espace restant dans la dimension d'empilement.

Vous pouvez utiliser un DockPanel avec LastChildFill défini sur true et ancrer tous les contrôles non remplissants sur la Left pour simuler l'effet souhaité.

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

Je recommanderais d'utiliser une grille à la place:

<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 façon de contourner ce problème est d'empiler l'étiquette sur le dessus plutôt que sur la droite. J'ai remarqué que UWP a une propriété d'en-tête intégrée que vous pouvez utiliser pour cela, pas sûr si la propriété d'en-tête existe pour WPF.

<TextBox Header="MyLabel" />






wpf