WPF TextBox não preenche StackPanel

94

Eu tenho um TextBoxcontrole dentro de um StackPanelcujo Orientationestá definido como Horizontal, mas não consigo fazer com que o TextBox preencha o espaço StackPanel restante.

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 é assim que se parece:

texto alternativo

Por que esse TextBox não está preenchendo o StackPanel?

Eu sei que posso ter mais controle usando um Gridcontrole, estou apenas confuso sobre o layout.

Hank
fonte

Respostas:

146

Eu tive o mesmo problema com StackPanel, e o comportamento é "por design". StackPaneldestina-se a "empilhar" coisas mesmo fora da região visível, portanto, não permitirá que você preencha o espaço restante na dimensão de empilhamento.

Você pode usar um DockPanelcom LastChildFilldefinido para truee encaixar todos os controles de não preenchimento em Leftpara simular o efeito desejado.

<DockPanel Background="Orange" LastChildFill="True">
    <TextBlock Text="a label" Margin="5" 
        DockPanel.Dock="Left" VerticalAlignment="Center"/>
    <TextBox Height="25" Width="Auto"/>
</DockPanel >
Zach Johnson
fonte
7
Só para esclarecer - LastChildFill é por padrão definido como "True" e definir HorizontalAlignment para esticar para a TextBox não tem efeito. :-)
Goblin
1
@Goblin: Sim ... copiei e colei o código do OP, mas esqueci de remover HorizontalAlignment. :)
Zach Johnson
Sério, isso é intencional? Parece estranho, pois o controle em si está obviamente abrangendo toda a largura. Você está dizendo que a área de conteúdo não é necessariamente a mesma que a área visível?
Hank,
1
@peter não faz coisas wpf há muito tempo, mas você pode tentar algum tipo de grade com a primeira coluna definida para ocupar o espaço disponível ( stackoverflow.com/questions/12432189/… )
Zach Johnson,
6
Estou um pouco atrasado para a festa aqui, mas @peter: você pode usar FlowDirection="RightToLeft"no DockPanel, então seu último filho será o esquerdo, usando o espaço que resta.
Dennis
16

Eu recomendaria usar uma grade em vez disso:

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

A outra maneira de contornar esse problema é empilhar a etiqueta na parte superior em vez de à direita. Percebi que UWP tem uma propriedade de cabeçalho embutida que você pode usar para isso, não tenho certeza se a propriedade de cabeçalho existe para WPF.

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

Pergunta antiga por tópico real:

HorizontalAlignment="Stretch"

é a coisa necessária. Juste certifique-se de remover o width.

glihm
fonte
1

Consigo preencher um StackPanel com uma caixa de texto usando o seguinte:

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

Caixa de texto preenchendo horizontalmente o painel da pilha

Ben
fonte
Sim, mas não em um painel de pilha horizontal; o seu é vertical :-)
JB. Com a Monica.