TranslateTransform移动元素超出预期

时间:2009-10-15 17:43:54

标签: c# .net wpf animation

我对WPF很新(并且对动画来说是全新的),所以我想这里有一些我在这里缺少的东西。我正在创建一个以特定方式放置控件的新布局Panel;这里的细节不是(或不应该)特别重要。我想做的是为我调用Arrange时我管理的元素的运动设置动画。

一般来说,我所做的是跟踪我曾经Rect每个子元素的Arrange。当ArrangeOverride被调用时......

  • 如果启用了动画并且元素有一个先前的边界Rect,我Arrange到新的宽度和高度的那个边界矩形的X和Y,然后使用两个{{ 1}} s(一个用于X,一个用于Y)将其设置为新边界的X和Y
  • 如果动画被禁用或元素没有现有的边界DoubleAnimation,我只需Rect到新边界

当我禁用动画时,一切都正确呈现(这是一件好事)。当我启用动画时,元素在不正确的位置呈现。如果我调整容器的大小,他们通常会将自己动画回正确的位置。

编辑以澄清

通常,错误似乎与控件边界的坐标直接相关。换句话说,如果控件距离右侧较远,则Arrange似乎将其偏移 more 而不是右侧的控件。上/下也是如此。再次,调整大小似乎纠正了问题(事实上,控件将自己设置为正确的位置,令人沮丧地整洁),但前提是整个控件集在新大小中可见。

这是该类的缩写版本:

TranslateTransform

1 个答案:

答案 0 :(得分:3)

您似乎正在将孩子安排到旧位置,然后应用渲染变换以使他们出现在新位置。这可能是一个问题,因为布局引擎可能会遇到问题,因为您为其提供了一个现在位于父布局容器之外的位置。你可能总是更好的运气安排到新的边界(在父元素内),然后应用渲染翻译动画将其移回原来的位置:

child.Arrange(newBounds);

int animationDuration = 300;

DoubleAnimation xAnim = new DoubleAnimation(lastBounds.X - newBounds.X, 0, TimeSpan.FromMilliseconds(animationDuration));
DoubleAnimation yAnim = new DoubleAnimation(lastBounds.Y - newBounds.Y, 0, TimeSpan.FromMilliseconds(animationDuration));
相关问题