如何在wpf中锚定文本框?

如何在wpf中锚定文本框?,wpf,Wpf,我有一个带标签的窗口。在其中一个选项卡上,我有如下布局。(事实上更复杂,我一行有4个文本框,我有更多的行。)如何使第三个文本框具有标签的宽度+上面文本框的宽度,也就是说,使它们正确对齐?问题是,当我在WPF中键入文本时,它会加宽第三个文本框。在尺寸上使用硬编码数字违背了WPF的全部目的。在Windows窗体中,我这样做的速度比在WPF中快10倍 有没有更好的方法,比为每一组连续的小文本框使用一个网格,不得不从网格中跳过大文本框,因为把它们放进去会把一切都搞砸 编辑:以下是基于Julien

我有一个带标签的窗口。在其中一个选项卡上,我有如下布局。(事实上更复杂,我一行有4个文本框,我有更多的行。)如何使第三个文本框具有标签的宽度+上面文本框的宽度,也就是说,使它们正确对齐?问题是,当我在WPF中键入文本时,它会加宽第三个文本框。在尺寸上使用硬编码数字违背了WPF的全部目的。在Windows窗体中,我这样做的速度比在WPF中快10倍

有没有更好的方法,比为每一组连续的小文本框使用一个网格,不得不从网格中跳过大文本框,因为把它们放进去会把一切都搞砸


编辑:以下是基于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" />