如何强制Stackpanel重新计算ActualHeight以解决已删除的ListViewItems?

时间:2019-05-29 01:02:14

标签: c# wpf xaml

从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>

0 个答案:

没有答案