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
默认提供的子组件布局和大小。网格
在一天结束时更加冗长,但似乎是一个好方法。