У меня есть пользовательская панель, которая использует визуальный слой, чтобы попытаться анимировать свойства Смещение и Размер каждого дочернего элемента, чтобы они анимировались в новые позиции и новые размеры.
Отлично работает для анимации смещения, но полностью игнорирует любые попытки анимировать размер.Можно ли даже анимировать свойство 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;
}
}