ActualHeight 增长但不缩小

ActualHeight Grows But Doesn't Shrink

我在使用 WPF 时遇到了一个奇怪的行为。

我的目标是 ItemsControl 在每个项目的一侧有一条垂直线,从项目的顶部到底部。由于项目的高度可能不同,我将 LineY2 属性 绑定到属于 [=] 的 StackPanelActualHeight 16=].

这是 XAML:

<ItemsControl Grid.Row="1" BorderThickness="0" ItemsSource="{Binding ShipmentActivity}" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Grid Name="ListBox">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="20"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>

                <Line Stroke="{StaticResource ButtonOutlineBrush}" X1="8" X2="8" Y1="0"
                      Y2="{Binding ActualHeight, ElementName=ShipmentActivity}"
                      StrokeThickness="1" />

                <StackPanel Grid.Column="1" Margin=".1" x:Name="ShipmentActivity">
                    <StackPanel.Resources>
                        <Style TargetType="TextBlock">
                            <Setter Property="TextWrapping" Value="Wrap"/>
                        </Style>
                    </StackPanel.Resources>
                    <TextBlock Text="{Binding Status}" FontWeight="SemiBold" FontSize="13" />
                    <TextBlock Text="{Binding Location}" Foreground="Gray"/>
                    <TextBlock Text="Wed, Sep 13, 2017, 8:29 PM (2 days ago)" Foreground="Gray"/>
                </StackPanel>
            </Grid>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

运行 这乍一看似乎很完美。一旦我开始缩小 window 的宽度,导致 TextBlocks 换行,这个问题就很明显了,实际上 导致项目的高度增加,然后将 window 的大小调整回其原始宽度(甚至超过)。虽然 TextBlock 恢复到原来的状态(和高度),但项目的高度保持不变 - 停留在最高点,在文本下方留下巨大的空隙,而 Line 的身高没有缩水。 Line 绝对是这里的罪魁祸首,因为删除该行可以解决问题。

更奇怪的是,为 StackPanel 添加边距,即使是最轻微的 (.1) 也能解决问题,并且项目会收缩回其预期高度。

我是不是做错了什么,或者这是一个错误?

我会使用 Border 元素来装饰 StackPanel,而不是使用 Line ].然后相应地设置边框的BorderThickness 属性。

因此您的 XAML 将是这样的:

<ItemsControl ...>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Border BorderThickness="1,0,0,0"
                BorderBrush="{StaticResource ButtonOutlineBrush}">
                <StackPanel ...>

您可以使用 Padding 属性 的 Border and/or Margin 属性 的 StackPanel 来 space-out两个元素。