2010-09-17 2 views
63

У меня есть TextBox элемент управления в пределах StackPanel, у которого Orientation установлено значение Horizontal, но не может получить TextBox, чтобы заполнить оставшееся пространство StackPanel.WPF TextBox не заполняет 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> 

И это то, что он выглядит следующим образом:

alt text

Почему это TextBox не заполняя StackPanel?

Я знаю, что я могу иметь больше контроля с помощью управления Grid, я просто смущен о макете.

ответ

107

У меня была такая же проблема с StackPanel, и поведение «по дизайну». StackPanel предназначен для «укладки» вещей даже за пределы видимой области, поэтому он не позволит вам заполнить оставшееся пространство в размере укладки.

Вы можете использовать набор DockPanel с LastChildFill в true и состыковать все не заполняющие элементы управления в Left для имитации эффекта вы хотите.

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

Просто уточнить - LastChildFill по умолчанию установлен на «True» и установка HorizontalAlignment для растягивания для TextBox не оказывает никакого эффекта. :-) – Goblin

+0

@Goblin: Да ... Я скопировал и вставил код OP, но забыл удалить «HorizontalAlignment». :) –

+0

Серьезно, это по дизайну? Кажется странным, поскольку сам контроль, очевидно, охватывает всю ширину. Вы говорите, что область содержимого не обязательно такая же, как видимая область? –

1

Я бы рекомендовал использовать сетку вместо:

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

Другой способ обойти эту проблему заключается в стек метку сверху, а не справа. Я заметил, что UWP имеет встроенное свойство заголовка, которое вы можете использовать для этого, но не уверен, существует ли свойство заголовка для WPF.

<TextBox Header="MyLabel" /> 
Смежные вопросы