均匀地 space StackPanel children 填充剩余的 space

Evenly space StackPanel children to fill remaining space

我在 WPF 中有一个 StackPanel,其中包含 LabelTextBoxStackPanel 的方向是 Vertical。我希望 children spaced 均匀分布在 StackPanel 的剩余高度之间,或者每个 UI 元素之间可能有一些动态填充或其他东西,我是不知道该怎么做。

这是目前的样子:

<StackPanel Margin="10 0" Grid.Row="1" Grid.RowSpan="3" Grid.Column="1">
    <Label>Template Name:</Label>
    <TextBox x:Name="templateNameTextBox"></TextBox>
    <Label>Object Name:</Label>
    <TextBox x:Name="objectNameTextBox"></TextBox>
    <Label>Custom Name:</Label>
    <TextBox x:Name="customNameTextBox"></TextBox>
</StackPanel>

最后一个 TextBox 下面只有一大堆空的 space。我知道我可能不得不在某个时候将每个 Label 和相应的 TextBox 放在它们自己的面板中,以便将它们分组,但在我弄清楚间距之前我没有为此烦恼.如果可能的话,我只是不想为每个人都设置静态值才能正确地 spaced。

已解决:

谢谢,当你提到网格时,我并没有考虑他们在他们自己的行中,这是有道理的,而且现在你提到它很清楚。统一的网格应该可以工作,因为它们都需要均匀 spaced。我还没有使用过 uniformgrid,也不知道它们的用途,所以谢谢你带我找到它们,我想这就是我会选择的。

为了均匀分布 space,您可以使用默认 star-sizing 的 Grid(每行 *)。

Columns and rows that are defined within a Grid can take advantage of Star sizing to distribute remaining space proportionally. When Star is selected as the height or width of a row or column, that column or row receives a weighted proportion of the remaining available space.

它可能看起来像这样(我添加了 StackPanels 来分组标签和文本框)。

<Grid Margin="10 0" Grid.Row="1" Grid.RowSpan="3" Grid.Column="1">
   <Grid.RowDefinitions>
      <RowDefinition/>
      <RowDefinition/>
      <RowDefinition/>
   </Grid.RowDefinitions>
   <StackPanel Grid.Row="0"
               VerticalAlignment="Center">
      <Label>Template Name:</Label>
      <TextBox x:Name="templateNameTextBox"></TextBox>
   </StackPanel>
   <StackPanel Grid.Row="1"
               VerticalAlignment="Center">
      <Label>Object Name:</Label>
      <TextBox x:Name="objectNameTextBox"></TextBox>
   </StackPanel>
   <StackPanel Grid.Row="2"
               VerticalAlignment="Center">
      <Label>Custom Name:</Label>
      <TextBox x:Name="customNameTextBox"></TextBox>
   </StackPanel>
</Grid>

由于所有元素的分布应该相等,您也可以使用 UniformGrid.

<UniformGrid Margin="10 0" Grid.Row="1" Grid.RowSpan="3" Grid.Column="1">
   <StackPanel VerticalAlignment="Center">
      <Label>Template Name:</Label>
      <TextBox x:Name="templateNameTextBox"></TextBox>
   </StackPanel>
   <StackPanel VerticalAlignment="Center">
      <Label>Object Name:</Label>
      <TextBox x:Name="objectNameTextBox"></TextBox>
   </StackPanel>
   <StackPanel VerticalAlignment="Center">
      <Label>Custom Name:</Label>
      <TextBox x:Name="customNameTextBox"></TextBox>
   </StackPanel>
</UniformGrid>-->