如何在wpf中锚定文本框?
我有一个带标签的窗口。在其中一个选项卡上,我有如下布局。(事实上更复杂,我一行有4个文本框,我有更多的行。)如何使第三个文本框具有标签的宽度+上面文本框的宽度,也就是说,使它们正确对齐?问题是,当我在WPF中键入文本时,它会加宽第三个文本框。在尺寸上使用硬编码数字违背了WPF的全部目的。在Windows窗体中,我这样做的速度比在WPF中快10倍 有没有更好的方法,比为每一组连续的小文本框使用一个网格,不得不从网格中跳过大文本框,因为把它们放进去会把一切都搞砸如何在wpf中锚定文本框?,wpf,Wpf,我有一个带标签的窗口。在其中一个选项卡上,我有如下布局。(事实上更复杂,我一行有4个文本框,我有更多的行。)如何使第三个文本框具有标签的宽度+上面文本框的宽度,也就是说,使它们正确对齐?问题是,当我在WPF中键入文本时,它会加宽第三个文本框。在尺寸上使用硬编码数字违背了WPF的全部目的。在Windows窗体中,我这样做的速度比在WPF中快10倍 有没有更好的方法,比为每一组连续的小文本框使用一个网格,不得不从网格中跳过大文本框,因为把它们放进去会把一切都搞砸 编辑:以下是基于Julien
编辑:以下是基于Julien Lebosquain的答案的解决方案:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="{x:Type Label}">
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="3"/>
</Style>
<Style x:Key="SmallTextBox" TargetType="{x:Type TextBox}"
BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Width" Value="50"/>
</Style>
</Window.Resources>
<StackPanel VerticalAlignment="Top" HorizontalAlignment="Left"
Width="{Binding ElementName=grid,Path=ActualWidth}">
<Grid Name="grid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label Content="Foo:"/>
<TextBox Grid.Column="1" Style="{StaticResource SmallTextBox}"/>
<Label Grid.Row="1" Content="Foobar:"/>
<TextBox Grid.Row="1" Grid.Column="1"
Style="{StaticResource SmallTextBox}"/>
<TextBox Grid.Row="2" Grid.ColumnSpan="2"/>
<Label Grid.Row="3" Content="Bar:"/>
<TextBox Grid.Row="3" Grid.Column="1"
Style="{StaticResource SmallTextBox}"/>
</Grid>
</StackPanel>
</Window>
我会有一个4行的网格。在第三行有一个列span。这也意味着您不需要SharedSizeGroup
<Grid Name="grid" HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label Content="Foo:"/>
<TextBox Grid.Column="1" Style="{StaticResource SmallTextBox}"/>
<Label Grid.Row="1" Content="Foobar:"/>
<TextBox Grid.Row="1" Grid.Column="1"
Style="{StaticResource SmallTextBox}"/>
<TextBox Grid.Row="2" Grid.ColumnSpan="2" />
<Label Content="Bar:"/>
<TextBox Grid.Row="3" Grid.Column="1" Style="{StaticResource SmallTextBox}"/>
</Grid>
我想你是弄错了。并不是最大的文本框把一切都搞砸了。事实上,小文本框的大小是固定的,这使得它们的行为不像最大的文本框。这里有一个矛盾:堆栈面板的使用意味着“占用我孩子的宽度”
width=Auto
,具有相同的行为,但您不希望堆栈面板增长
在可视化树的较高位置,您需要指定一个宽度或使用一个控件,该控件的大小调整行为是占用整个空间,如网格
就我个人而言,我将采用以下解决方案:
- 只使用一个内部网格,小文本框不再具有固定大小,大文本框具有
网格。ColumnSpan=“2”
- 将
应用于第一列,将Width=“Auto”
应用于第二列Width=“*”
- 将现有的
替换为第一列固定或星形的堆栈面板
(以便在调整窗口大小时缩放)。将您的内部网格放在第一列中网格
HorizontalAlignment="Center" VerticalAlignment="Center"
例如,文本框是:
<TextBox x:Name="txtMyName1" Margin="3" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBox x:Name="txtMyName2" Margin="3" />
这不起作用。在第三个文本框中键入一些文本可以使其更宽。谢谢。将第二列的宽度设置为*成功了。它有一个小故障。我可以使用单个网格,但我需要保留stackpanel,宽度为=“{Binding ElementName=grid,Path=ActualWidth}”。
HorizontalAlignment="Center" VerticalAlignment="Center"
<TextBox x:Name="txtMyName1" Margin="3" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<TextBox x:Name="txtMyName2" Margin="3" />