从ListView删除一个项目后,它消失了,但是,它所占用的空间尚未从包含的StackPanel的ActualHeight中删除。
结果是,当我尝试对此包含元素的高度进行动画处理以显示和隐藏其区域时,由于我使用ActualHeight作为动画结尾的目标值,因此我得到了一个多余的空白区域,以前的ListView项是
尝试了许多形式的方法,例如UpdateLayout(),UpdateDefaultStyle(),InvalidateVisuals()和其他可用的无效方法。尚未有人强制进行完全正确的更新。
我在两种情况下进行动画处理,一种情况是在更改ListViewItem计数时进行动画处理,另一种情况是在要隐藏或显示整个区域时进行动画处理。两者都使用相同的动画代码,唯一的区别是我从0开始并转到ActualHeight(用于显示),反之亦然(用于隐藏)来显示隐藏整个事情,而我使用Height和ActualHeight为我的动画设置动画添加或删除ListViewItem时的新高度。需要说明的是,最后一个动画在添加时起作用,而在删除时不起作用,因为在一种情况下,ActualHeight已更新,而在另一种情况下,则没有。
动画代码。
public void RevealEditor<ElementType>(ElementType toBeAnimated)
where ElementType : FrameworkElement
{
if (toBeAnimated.Height == 0)
RevealAnimation(toBeAnimated, 0, toBeAnimated.ActualHeight);
else if (toBeAnimated.Height == toBeAnimated.ActualHeight)
RevealAnimation(toBeAnimated, toBeAnimated.ActualHeight, 0);
}
public void RevealAnimation<ElementType>(ElementType toBeAnimated, double oldVal, double newVal)
where ElementType : FrameworkElement
{
var animation = new DoubleAnimation
{
From = oldVal,
To = newVal,
Duration = new Duration(TimeSpan.FromSeconds(1)),
EasingFunction = new SineEase { EasingMode = EasingMode.EaseIn }
};
toBeAnimated.BeginAnimation(FrameworkElement.HeightProperty, animation);
}
ListView更改代码。
当某人更改IntegerUpDown控件上的数字时,我更改了项目数。然后,我尝试设置动画,以便他们只能看到Stackpanel使用的区域,其中包括ListView及其项。
private void DescriptionsItemNumberInput_ValueChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (!initialized || e.OldValue == null) return;
else common.ChangeNumListItems(sender, e, DescriptionsTextBoxInputs, DescriptionsInput);
ResourceDetailsEditor.UpdateLayout();
common.RevealAnimation(
ResourceDetailsEditor,
ResourceDetailsEditor.Height,
ResourceDetailsEditor.ActualHeight);
}
XAML代码。
正在动画的区域和更改项目的XAML代码。我删除了一些XAML,因为那里还有另外两个几乎相同的ListView,但是我只测试了最底端的一个。
<StackPanel x:Name="ResourceDetailsEditor" Height="0" Orientation="Vertical">
<StackPanel Orientation="Vertical">
<Label Width="auto">
Resource ID
</Label>
<TextBox
Name="ResourceIDInput"
Height="30"
Width="130"
ToolTip="0"
TextChanged="ResourceIDInput_TextChanged">
</TextBox>
</StackPanel>
<StackPanel Orientation="Vertical">
<StackPanel Orientation="Horizontal">
<Label Width="100">
Descriptions IDs
</Label>
<xctk:IntegerUpDown Name="DescriptionsItemNumberInput" Width="40" Value="0" Minimum="0" ValueChanged="DescriptionsItemNumberInput_ValueChanged"/>
</StackPanel>
<ListView Name="DescriptionsInput" Visibility="Collapsed" BorderThickness="0"></ListView>
</StackPanel>
</StackPanel>