我正在尝试为画布中的图像的左侧属性设置动画。
当我在做的时候:
image.SetValue(Canvas.LeftProperty, destX[i]);
这是有效的。
但是当我在做的时候:
Animate(image, lastValue, destX[i], 500);
带
private void Animate(Image image, double val1, double val2, double miliseconds)
{
DoubleAnimation myDoubleAnimation = new DoubleAnimation { From = val1, To = val2, Duration = new Duration(TimeSpan.FromMilliseconds(miliseconds)) };
TranslateTransform ts = new TranslateTransform();
image.RenderTransform = ts;
Storyboard.SetTarget(myDoubleAnimation, ts);
Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(TranslateTransform.XProperty));
Storyboard myMovementStoryboard = new Storyboard();
myMovementStoryboard.Children.Add(myDoubleAnimation);
myMovementStoryboard.Begin();
myMovementStoryboard.Completed += (s, e) =>
{
image.SetValue(Canvas.LeftProperty, val2);
};
}
它不能正常工作
我的Animate功能有什么问题? 即使动画可能做得不好,完成的事件也应该将好的值重置为canvas.leftproperty。
但就我而言,出了点问题。
你将如何完成Animate功能?
提前感谢您提供任何帮助
答案 0 :(得分:6)
我是这样做的,而且效果很好。
DoubleAnimation myDoubleAnimation = new DoubleAnimation { From = val1, To = val2, Duration = new Duration(TimeSpan.FromMilliseconds(miliseconds)) };
//set the target of the animation
Storyboard.SetTarget(myDoubleAnimation, Image);
//set the target property of the animation. Don't forget the ( ) around canvas.left
Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath("(Canvas.Left)"));
//create the storyboard
Storyboard myMovementStoryboard = new Storyboard();
//add the animation to the storyboard
myMovementStoryboard.Children.Add(myDoubleAnimation);
//begin animation
myMovementStoryboard.Begin();
答案 1 :(得分:0)
您正在设置Canvas.LeftProperty,但您正在为TranslateTransform.XProperty设置动画。这些是非常不同的属性,因为在布局传递之后应用了translate转换。因此,使用Canvas.Left在Canvas中布置对象,但是TranslateTransform会使其从原始原点移动。你应该做的是将TranslateTransform.XProperty设置回val2。
myMovementStoryboard.Completed += (s, e) =>
{
ts.X = val2;
};
也就是说,动画不应该在中间失败,所以这个额外的保护措施不是必需的。