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.

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 >

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

2

Pregunta anterior por tema real:

HorizontalAlignment="Stretch"

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


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


Sí, pero no en un panel de apilado horizontal; el tuyo es vertical :-)
JB. Con Monica.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.