ActualHeight 增长但不缩小
ActualHeight Grows But Doesn't Shrink
我在使用 WPF 时遇到了一个奇怪的行为。
我的目标是 ItemsControl
在每个项目的一侧有一条垂直线,从项目的顶部到底部。由于项目的高度可能不同,我将 Line
的 Y2
属性 绑定到属于 [=] 的 StackPanel
的 ActualHeight
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 的宽度,导致 TextBlock
s 换行,这个问题就很明显了,实际上
导致项目的高度增加,然后将 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两个元素。
我在使用 WPF 时遇到了一个奇怪的行为。
我的目标是 ItemsControl
在每个项目的一侧有一条垂直线,从项目的顶部到底部。由于项目的高度可能不同,我将 Line
的 Y2
属性 绑定到属于 [=] 的 StackPanel
的 ActualHeight
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 的宽度,导致 TextBlock
s 换行,这个问题就很明显了,实际上
导致项目的高度增加,然后将 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两个元素。