WPF TextBox no completará StackPanel

94

Tengo un TextBoxcontrol dentro de un StackPanelcuyo Orientationestá configurado en Horizontal, pero no puedo hacer que TextBox llene el espacio restante de StackPanel.

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>

Y así es como se ve:

texto alternativo

¿Por qué ese TextBox no llena el StackPanel?

Sé que puedo tener más control usando un Gridcontrol, solo estoy confundido acerca del diseño.

Madeja
fuente

Respuestas:

146

He tenido el mismo problema con StackPanel, y el comportamiento es "por diseño". StackPanelestá diseñado para "apilar" cosas incluso fuera de la región visible, por lo que no le permitirá llenar el espacio restante en la dimensión de apilamiento.

Puede utilizar un conjunto DockPanelcon with y acoplar todos los controles que no completan el para simular el efecto que desea.LastChildFilltrueLeft

<DockPanel Background="Orange" LastChildFill="True">
    <TextBlock Text="a label" Margin="5" 
        DockPanel.Dock="Left" VerticalAlignment="Center"/>
    <TextBox Height="25" Width="Auto"/>
</DockPanel >
Zach Johnson
fuente
7
Solo para aclarar: LastChildFill está configurado de forma predeterminada en "True" y configurar HorizontalAlignment para estirar para TextBox no tiene ningún efecto. :-)
Goblin
1
@Goblin: Sí ... Copié y pegué el código del OP pero olvidé eliminarlo HorizontalAlignment. :)
Zach Johnson
En serio, ¿esto es por diseño? Parece extraño, ya que el control en sí, obviamente, abarca todo el ancho. ¿Está diciendo que el área de contenido no es necesariamente la misma que el área visible?
Hank
1
@peter no ha hecho cosas de wpf en mucho tiempo, pero puede probar algún tipo de cuadrícula con la primera columna configurada para ocupar el espacio disponible ( stackoverflow.com/questions/12432189/… )
Zach Johnson
6
Llego un poco tarde a la fiesta aquí, pero @peter: puedes usar FlowDirection="RightToLeft"en el DockPanel, así que tu último hijo será el que quede, usando el espacio restante.
Dennis
16

Recomendaría usar una cuadrícula en su lugar:

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

La otra forma de solucionar este problema es apilar la etiqueta en la parte superior en lugar de a la derecha. Noté que UWP tiene una propiedad de encabezado incorporada que puede usar para eso, no estoy seguro de si la propiedad de encabezado existe para WPF.

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

Pregunta anterior por tema real:

HorizontalAlignment="Stretch"

es lo requerido. Solo asegúrese de quitar el width.

glihm
fuente
1

Puedo llenar un StackPanel con un cuadro de texto usando lo siguiente:

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

Cuadro de texto llenando horizontalmente el panel de pila

Ben
fuente
Sí, pero no en un panel de apilado horizontal; el tuyo es vertical :-)
JB. Con Monica.