2010-09-17 22 views
63

Tengo un control TextBox dentro de un StackPanel cuyo Orientation está configurado en Horizontal, pero no puedo obtener el TextBox para llenar el espacio restante de StackPanel.WPF TextBox no rellenará 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 esto es lo que parece:

alt text

¿Por qué es que TextBox no llenar el StackPanel?

Sé que puedo tener más control mediante el uso de un control Grid, estoy confundido sobre el diseño.

Respuesta

107

He tenido el mismo problema con StackPanel, y el comportamiento es "por diseño". StackPanel está 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.

Usted puede utilizar un conjunto DockPanel con LastChildFill a true y muelle todos los controles de no llenado a la Left para simular el efecto que desea.

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

Solo para aclarar: LastChildFill se establece de forma predeterminada en "Verdadero" y el ajuste HorizontalAlignment para estirar para el TextBox no tiene ningún efecto. :-) – Goblin

+0

@Goblin: Sí ... Copié y pegué el código del OP pero olvidé eliminar 'HorizontalAlignment'. :) –

+0

En serio, esto es por diseño? Parece extraño, ya que el control en sí mismo obviamente abarca todo el ancho. ¿Estás diciendo que el área de contenido no es necesariamente la misma que el área visible? –

1

Yo recomiendo 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 manera de solucionar este problema es colocar la etiqueta en la parte superior en lugar de a la derecha. Noté que UWP tiene una propiedad de encabezado integrada que puedes usar para eso, no estoy seguro de si la propiedad del encabezado existe para WPF.

<TextBox Header="MyLabel" />