我正在尝试学习WPF和动画。我有一个简单的程序,允许用户使用鼠标移动椭圆。释放鼠标按钮时,椭圆的位置将朝向屏幕顶部进行动画处理。
第一次抓住椭圆时这很好用。但是第二次抓住椭圆我不能再改变它的y位置(但我仍然可以改变x位置)。 动画是否会以某种方式移除附加的
Canvas.Top
属性?我该如何解决这个问题?
以下是启动动画的代码(位于MouseUp处理程序中)
Duration duration = new Duration(TimeSpan.FromSeconds(5.0*oldY/1000));
DoubleAnimation anim = new DoubleAnimation(oldY, 0, duration); // move to top of canvas
_shapeSelected.BeginAnimation(Canvas.TopProperty, anim);
这里是鼠标移动处理程序
private void Canvas_MouseMove_1(object sender, MouseEventArgs e)
{
if (_shapeSelected != null)
{
Point pt = e.GetPosition(theCanvas);
Canvas.SetLeft(_shapeSelected, (pt.X-_posOfMouseOnHit.X) + _posOfShapeOnHit.X );
Canvas.SetTop(_shapeSelected, (pt.Y-_posOfMouseOnHit.Y) + _posOfShapeOnHit.Y );
}
}
答案 0 :(得分:1)
正如您在MSDN中的here中所看到的,动画设置的值(等级2)优先于本地值(等级3)。如果要再次手动设置值,则必须先停止或删除动画。 (另请参阅本网站上的“强制,动画和基本价值”部分)
答案 1 :(得分:1)
将动画FillBehavior
设置为Stop
。由于该属性现在在动画结束时恢复为当前local value,因此您还必须在动画开始后设置本地值。
var anim = new DoubleAnimation(oldY, 0, duration, FillBehavior.Stop);
_shapeSelected.BeginAnimation(Canvas.TopProperty, anim);
Canvas.SetTop(_shapeSelected, 0);