WPF:Measure/Arrange在动画期间仅调用一次

WPF:Measure/Arrange在动画期间仅调用一次,wpf,layout,wpf-controls,measureoverride,arrangeoverride,Wpf,Layout,Wpf Controls,Measureoverride,Arrangeoverride,我正在使用一个自定义的网格状面板,其中一个元素可以缩放。 首先,所有元素的大小都相同。如果一个元素应该被缩放,它的大小将是以前的两倍,其余的元素将均匀地填充剩余的空间(因此,除具有缩放元素的同一行或同一列中的元素外,所有元素的高度和宽度都会变小,同一行中的元素的宽度和缩放高度都会变小,等等) 在我为缩放添加动画之前,一切都很顺利 我正在计算测量过程中每个元素的大小,首先我用计算出的大小测量每个元素。元素本身的大小为NaN,直到它们被缩放为止。我通过将它们设置为最终大小来缩放它们,然后开始从旧动画

我正在使用一个自定义的网格状面板,其中一个元素可以缩放。 首先,所有元素的大小都相同。如果一个元素应该被缩放,它的大小将是以前的两倍,其余的元素将均匀地填充剩余的空间(因此,除具有缩放元素的同一行或同一列中的元素外,所有元素的高度和宽度都会变小,同一行中的元素的宽度和缩放高度都会变小,等等)

在我为缩放添加动画之前,一切都很顺利

我正在计算测量过程中每个元素的大小,首先我用计算出的大小测量每个元素。元素本身的大小为NaN,直到它们被缩放为止。我通过将它们设置为最终大小来缩放它们,然后开始从旧动画到新动画

但是,当我添加动画时,仅在第一个动画步骤中调用了“测量”和“排列”。 当我试着用availableSize或无限大的尺寸来测量元素时,动画效果很好,但是元素没有在尺寸变小的地方正确地调整大小

有人知道如何解决其中一种行为吗

问候 托拜厄斯

编辑:动画代码:

        Size normalSize = GetNormalElementSize(new Size(ActualWidth, ActualHeight));

        DoubleAnimation widthAnimation = new DoubleAnimation
        {
            From = normalSize.Width,
            To = normalSize.Width * 2,
            Duration = TimeSpan.FromMilliseconds(750),
            EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseInOut }
        };

        DoubleAnimation heightAnimation = new DoubleAnimation
        {
            From = normalSize.Height,
            To = normalSize.Height * 2,
            Duration = TimeSpan.FromMilliseconds(750),
            EasingFunction = new QuadraticEase { EasingMode = EasingMode.EaseInOut }
        };

        ZoomedElement.Height = normalSize.Height;
        ZoomedElement.Width = normalSize.Width;

        Storyboard.SetTargetProperty(widthAnimation, new PropertyPath(FrameworkElement.WidthProperty));
        Storyboard.SetTarget(widthAnimation, ZoomedElement);
        Storyboard.SetTargetProperty(heightAnimation, new PropertyPath(FrameworkElement.HeightProperty));
        Storyboard.SetTarget(heightAnimation, ZoomedElement);

        Storyboard zoomStoryboard = new Storyboard();
        zoomStoryboard.Children.Add(heightAnimation);
        zoomStoryboard.Children.Add(widthAnimation);
        zoomStoryboard.CurrentTimeInvalidated += zoomStoryboard_CurrentTimeInvalidated;
        zoomStoryboard.Begin();

我猜您正在使用RenderTransformation,请尝试LayoutTransformation。

放置添加动画的代码,这将对您有所帮助。我添加了上面使用的代码请参见上面的编辑。我尝试将ScaleTransform设置为Layouttransform,结果我的缩放元素希望全屏显示为大小(我猜,因为缩放前它们的大小为NaN),而不是实际大小的两倍