Визуальный слой XAML, похоже, не способен анимировать целевое свойство Size - PullRequest
0 голосов
/ 13 июня 2018

У меня есть пользовательская панель, которая использует визуальный слой, чтобы попытаться анимировать свойства Смещение и Размер каждого дочернего элемента, чтобы они анимировались в новые позиции и новые размеры.

Отлично работает для анимации смещения, но полностью игнорирует любые попытки анимировать размер.Можно ли даже анимировать свойство Size?Или есть что-то особенное, что мешает этому случиться?

public class CustomPanel : Panel
{
    private HashSet<UIElement> _elements = new HashSet<UIElement>();

    protected override Size MeasureOverride(Size availableSize)
    {
        Size totalSize = new Size();

        foreach (UIElement child in Children)
        {
            if (!_elements.Contains(child))
            {
                Visual visual = ElementCompositionPreview.GetElementVisual(child);
                Compositor compositor = visual.Compositor;

                ImplicitAnimationCollection implicits = compositor.CreateImplicitAnimationCollection();

                Vector3KeyFrameAnimation offsetAnimation = compositor.CreateVector3KeyFrameAnimation();
                offsetAnimation.Target = nameof(Visual.Offset);
                offsetAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue");
                offsetAnimation.Duration = TimeSpan.FromSeconds(1);

                Vector2KeyFrameAnimation sizeAnimation = compositor.CreateVector2KeyFrameAnimation();
                sizeAnimation.Target = nameof(Visual.Size);
                sizeAnimation.InsertExpressionKeyFrame(1.0f, "this.FinalValue");
                sizeAnimation.Duration = TimeSpan.FromSeconds(1);

                implicits[nameof(Visual.Offset)] = offsetAnimation;
                implicits[nameof(Visual.Size)] = sizeAnimation;
                visual.ImplicitAnimations = implicits;

                _elements.Add(child);
            }

            child.Measure(availableSize);
            totalSize.Width = Math.Max(totalSize.Width, child.DesiredSize.Width);
            totalSize.Height += child.DesiredSize.Height;
        }

        return totalSize;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        Point anchorPoint = new Point(0, 0);
        foreach (UIElement child in Children)
        {
            child.Arrange(new Rect(anchorPoint, child.DesiredSize));
            anchorPoint.Y += child.DesiredSize.Height;
            anchorPoint.X += child.DesiredSize.Height / 2;
        }

        return finalSize;
    }
}

1 Ответ

0 голосов
/ 13 июня 2018

Может быть, вы можете взглянуть на эту статью MSDN , в которой объясняется, как анимировать размер элемента фреймворка.

...