新手 WPF:动画是否删除附加属性

本文关键字:属性 删除 是否 WPF 动画 新手 | 更新日期: 2023-09-27 18:31:13

我正在尝试学习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 );
        }
    }

新手 WPF:动画是否删除附加属性

将动画的FillBehavior设置为 Stop 。由于该属性现在在动画完成后恢复为其当前本地值,因此还必须在动画启动后设置本地值。

var anim = new DoubleAnimation(oldY, 0, duration, FillBehavior.Stop);
_shapeSelected.BeginAnimation(Canvas.TopProperty, anim);
Canvas.SetTop(_shapeSelected, 0); 

正如您在 MSDN 中看到的那样,动画设置的值(等级 2)的优先级高于本地值(等级 3)。如果要再次手动设置该值,则必须在之前停止或删除动画。(另请参阅本网站上的"强制、动画和基本价值"部分)