WPF TextBox не будет заполнять StackPanel
У меня есть элемент управления TextBox
в StackPanel
, для которого Orientation
установлено значение Horizontal
, но не может заставить 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
, меня просто путают в макете.
Ответы
Ответ 1
У меня была такая же проблема с 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 >
Ответ 2
Вместо этого я рекомендую использовать Grid:
<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" />
Ответ 3
Я могу заполнить StackPanel с помощью текстового поля, используя следующее:
<StackPanel Margin="5,5,5,5">
<Label Content = "lblExample" Width = "70" Padding="0" HorizontalAlignment="Left"/>
<TextBox Name = "txtExample" Text = "Example Text" HorizontalContentAlignment="Stretch"/>
</StackPanel>
Textbox Горизонтально Заполняющая Стеклопанель