uwp UniformGrid 在行之间有不需要的垂直间距

uwp UniformGrid has unwanted vertical spacing between rows

我有多个文本框,我想在固定的 2 列中从左到右正确填充,因为代码背后有运行时逻辑,可以更改任何文本框的可见性,所以我希望所有可见框位于任何给定的时间都可以正确对齐,这就是我使用社区工具包中的 UniformGrid 的原因,但是所有行之间都有一些 不需要的垂直间距 .

重现问题的示例项目:https://github.com/touseefbsb/UniformGridIssue

示例代码

<Grid>
    <controls:UniformGrid
        x:Name="CommonPanel"
        Background="Brown"
        Columns="2"
        Orientation="Horizontal">
        <TextBox Height="112" HorizontalAlignment="Stretch" />
        <TextBox Height="112" HorizontalAlignment="Stretch" />
        <TextBox Height="112" HorizontalAlignment="Stretch" />
        <TextBox Height="112" HorizontalAlignment="Stretch" />
        <TextBox Height="112" HorizontalAlignment="Stretch" />
        <TextBox Height="112" HorizontalAlignment="Stretch" />
        <TextBox Height="112" HorizontalAlignment="Stretch" />
        <TextBox Height="112" HorizontalAlignment="Stretch" />
        <TextBox Height="112" HorizontalAlignment="Stretch" />
        <TextBox Height="112" HorizontalAlignment="Stretch" />
        <TextBox Height="112" HorizontalAlignment="Stretch" />
    </controls:UniformGrid>
</Grid>

每个项目的上下似乎都有一些关于 27 的余量,但我不确定它来自哪里。

更新 1

这是一个示例项目,我的原始项目中每个文本框的高度为 112,有些文本框的高度是原来的两倍,我们也可能会动态生成其中一些文本框,所以我想我可能需要将大高度的文本框分开,但是有没有我可以为所有行设置相同的高度吗?考虑到我不知道确切的行数?

我试过跟随,但它给了我第 1 行 112 的高度。

有两个组件在起作用,文本框(27 像素)和边框之间的 space。

如果您 select 在任何这些文本框中,您会看到边框颜色变为蓝色。如果将鼠标悬停在它们上方,您会看到这些相同边框的视觉状态发生变化。

要删除它,请将 BorderThickness 设置为 0:

<TextBox Height="112"
         HorizontalAlignment="Stretch"
         BorderThickness="0"/>

或者让这对你自己更容易,并创建一个隐式文本框样式:

<controls:UniformGrid x:Name="CommonPanel"
                      Background="Brown"
                      Columns="2"
                      Orientation="Horizontal">
    <controls:UniformGrid.Resources>
        <Style TargetType="TextBox">
            <Setter Property="Height"
                    Value="112" />
            <Setter Property="HorizontalAlignment"
                    Value="Stretch" />
            <Setter Property="BorderThickness"
                    Value="0" />
        </Style>
    </controls:UniformGrid.Resources>
    <TextBox />
    <TextBox />
    <TextBox />
    <TextBox />
    <TextBox />
    <TextBox />
    <TextBox />
    <TextBox />
    <TextBox />
    <TextBox />
    <TextBox />
</controls:UniformGrid>

现在,让我们讨论剩余的像素填充。您已经对 TextBox 的高度进行了硬编码,这限制了它可以填充 space 的大小。要删除该填充,请将其从样式中删除:

<Style TargetType="TextBox">
     <Setter Property="HorizontalAlignment" Value="Stretch" />
     <Setter Property="VerticalAlignment" Value="Stretch" />
     <Setter Property="BorderThickness" Value="0" />
</Style>

了解布局

我想添加一些附加信息,以防您试图强制行适合 112 像素。

您可以将 UniformGrid 视为自己手动添加 RowDefinition 和 ColumnDefinition。

<Grid>
    <Grid.RowDefinitions>
        <!-- One of these is created for every row needed  -->
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <!-- One of these is created for every column needed  -->
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
</Grid>

由于您在 UniformGrid 中有 11 个子项并设置列 2,因此它实际上与此相同:

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

    <TextBox Grid.Row="0" 
             Grid.Column="0"/>
    <TextBox Grid.Row="0"
             Grid.Column="1" />
    <TextBox Grid.Row="1"
             Grid.Column="0" />
    <TextBox Grid.Row="1"
             Grid.Column="1" />
    <TextBox Grid.Row="2"
             Grid.Column="0" />
    <TextBox Grid.Row="2"
             Grid.Column="1" />
    <TextBox Grid.Row="3"
             Grid.Column="0" />
    <TextBox Grid.Row="3"
             Grid.Column="1" />
    <TextBox Grid.Row="4"
             Grid.Column="1" />
    <TextBox Grid.Row="5"
             Grid.Column="0" />
    <TextBox Grid.Row="5"
             Grid.Column="1" />
</Grid>

更新

您可以在加载后动态覆盖 UniformGrid RowDefinitions 的大小。这将使行高缩小到文本框使用的 112 像素。

XAML - 订阅 Loaded 事件

<controls:UniformGrid x:Name="CommonPanel" Loaded="CommonPanel_Loaded" .../>
``

```csharp
// Will fire when the UniformGrid is loaded
private void CommonPanel_Loaded(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
    // Iterate over all the RowDefinitions
    for (int i = 0; i < CommonPanel.RowDefinitions.Count - 1; i++)
    {
        // FEATURE - Here you override the Star-Height with Auto height
        CommonPanel.RowDefinitions[i].Height = GridLength.Auto;
    }
}

最后,还有最后一步确保最后一行的文本框正确对齐。将样式的 VerticalAlignment 设置为顶部:

<Style TargetType="TextBox">
    <Setter Property="Height"
            Value="112" />
    <Setter Property="HorizontalAlignment"
            Value="Stretch" />
    <Setter Property="VerticalAlignment"
            Value="Top" />
    <Setter Property="BorderThickness"
            Value="0" />
</Style>

重要 如果您要在 运行 时向 UniformGrid 添加新项目,您将需要再次重新 运行 该逻辑。