C# 如何使用WPF XAML构造堆叠表单?

C# 如何使用WPF XAML构造堆叠表单?,c#,wpf,xaml,C#,Wpf,Xaml,在我的窗口上,我有一个GroupBox。我想在GroupBox中构建一个水平对齐的表单。水平对齐是指标签和输入位于同一网格行或x轴上的表单。单独的表单标签+输入位于各自的行中 由于GroupBox只能有一个子内容,因此我假设我需要使用网格或堆栈面板。我尝试使用StackPanel,因为它看起来更简单,应该可以实现我的目标 我试图解决的问题是,如何将输入和标签组合成一个单元,这样它们就可以水平地彼此相邻,但在堆栈面板中作为一对垂直堆叠可能最好使用网格,这样可以使标签和输入垂直对齐。虽然使用堆栈面板

在我的窗口上,我有一个
GroupBox
。我想在
GroupBox
中构建一个水平对齐的表单。水平对齐是指标签和输入位于同一网格行或x轴上的表单。单独的表单标签+输入位于各自的行中

由于
GroupBox
只能有一个子内容,因此我假设我需要使用
网格
堆栈面板
。我尝试使用
StackPanel
,因为它看起来更简单,应该可以实现我的目标


我试图解决的问题是,如何将输入和标签组合成一个单元,这样它们就可以水平地彼此相邻,但在
堆栈面板中作为一对垂直堆叠
可能最好使用
网格
,这样可以使标签和输入垂直对齐。虽然使用堆栈面板并非不可能,但要困难得多。如果将栅格的
RowDefinition
高度设置为“自动”,栅格的高度将仅为所需的高度:

<GroupBox>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <TextBlock Grid.Row="0" Grid.Column="0" Text="Label1"/>
        <TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Input1}"/>
        <TextBlock Grid.Row="1" Grid.Column="0" Text="Label2"/>
        <TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Input2}"/>
        etc.
    </Grid>
</GroupBox>

您可能需要使用边距和/或填充以及水平对齐来获得您想要的布局,但这应该会给您提供实现所需的控制。

您可以在groupbox内使用方向等于垂直的stackpanel,在该stackpanel内,您可以使用另一个方向等于水平方向的stackpanel作为标签和输入,就像下面的示例代码一样


您可能会发现一个有用的功能是网格共享大小范围。通过共享元素的列\行大小,它可以帮助您对齐多个不同网格中的元素,如下所示:

<GroupBox Header="Sample GroupBox">
    <StackPanel Orientation="Vertical" Grid.IsSharedSizeScope="True">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"  SharedSizeGroup="firstGroup" />
                <ColumnDefinition Width="Auto"  SharedSizeGroup="secondGroup" />
            </Grid.ColumnDefinitions>
            <Label Content="input11" Grid.Column="0" />
            <TextBox Grid.Column="1" Width="100"/>
        </Grid>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"  SharedSizeGroup="firstGroup" />
                <ColumnDefinition Width="Auto"  SharedSizeGroup="secondGroup" />
            </Grid.ColumnDefinitions>
            <Label Content="input2222222" Grid.Column="0" />
            <TextBox Grid.Column="1"/>
        </Grid>
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"  SharedSizeGroup="firstGroup" />
                <ColumnDefinition Width="Auto"  SharedSizeGroup="secondGroup" />
            </Grid.ColumnDefinitions>
            <Label Content="input3333333333333" Grid.Column="0" />
            <TextBox Grid.Column="1"/>
        </Grid>
    </StackPanel>
</GroupBox>


在上面的代码中,我并没有说这是必要的,但这只是一个示例。通常,您希望在例如ItemsControl的ItemTemplate中使用网格,并且希望所有项目都对齐。在这里,共享大小范围可能会有所帮助。

如果不希望标签和输入垂直排列,这很好,但如果要这样做,则需要做大量工作,可能还需要硬编码值。现在我很清楚,有很多方法可以做到这一点。虽然我最初的问题是关于
StackPanel
,但我觉得
Grid
感觉更灵活,但更重要的是,它解决了最初的问题,对默认设置的更改最少。我首先试用了
StackPanel
,但发现需要进行大量定制才能实现
Grid
默认提供的子组件布局和大小。
网格
在一天结束时更加冗长,但似乎是一个好方法。