如何保持动态大小的控件对齐?

时间:2013-10-28 16:19:17

标签: c# wpf layout

我有一个WPF应用程序,我正在寻找一种方法来对齐一些Label和TextBox控件,以便TextBox控件始终是内联的,但也允许Label内容是动态的(应该根据需要移动TextBox)

这有点难以解释,所以这里有一些截图应该显示我的要求......

在:

enter image description here

后:

enter image description here

注意第一个TextBox如何向右移动以便为较长的文本腾出空间,而第二个TextBox也会移动以保持与第一个文本的内联。 (我想要的行为类似于HTML表,每行两行,每行两个)

请记住,我对WPF相当新(所以我可能完全走错了路),我使用了几个StackPanel来满足动态大小的标签。但是,问题当然是两个StackPanel都不知道彼此。

这是我目前的代码:

<StackPanel Orientation="Horizontal">
    <Label Content="Label 1" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    <TextBox HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" Width="200"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
    <Label Content="Label 2" HorizontalAlignment="Left" VerticalAlignment="Top"/>
    <TextBox HorizontalAlignment="Left" Height="23" TextWrapping="Wrap" VerticalAlignment="Top" Width="200"/>
</StackPanel>

无论如何使用StackPanels得到我想要的东西?如果没有,我可以使用哪些其他控件或方法来满足我的要求?

2 个答案:

答案 0 :(得分:3)

如果您希望所有控件的列大小相同,只需使用Grid

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="23"/>
        <RowDefinition Height="23"/>
    </Grid.RowDefinitions>

    <Label Grid.Row="0" Grid.Column="0" Content="Longer Label 1"/>
    <TextBox Grid.Row="0" Grid.Column="1" TextWrapping="Wrap"/>
    <Label Grid.Row="1" Grid.Column="0" Content="Label 2" />
    <TextBox Grid.Row="1" Grid.Column="1" TextWrapping="Wrap"/>    
</Grid>

使用此设置,第一列的大小将适合最宽的标签,第二列将占用其余的标签。

答案 1 :(得分:1)

只需使用Grid

<Grid Grid.Row="2" VerticalAlignment="Top">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
        ...
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0" Grid.Column="0" Text="Name" Style="{StaticResource 
    LabelStyle}" />
    <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Name, 
    UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource TextBoxStyle}" />
    <TextBox Grid.Row="1" Grid.Column="0" Text="Age" Style="{StaticResource 
    LabelStyle}" />
    <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Age, 
    UpdateSourceTrigger=PropertyChanged}" Style="{StaticResource TextBoxStyle}" />
    ...
</Grid>