【问题标题】:Newbie WPF: Does the animation remove the attached property?新手WPF:动画是否删除附加属性?
【发布时间】:2014-11-19 21:26:09
【问题描述】:

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

        }

    }

【问题讨论】:

    标签: c# wpf animation attached-properties


    【解决方案1】:

    将动画的FillBehavior 设置为Stop。由于动画结束后属性现在恢复为当前的local value,因此您还必须在动画开始后设置本地值。

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

    【讨论】:

    • BeginAnimation 的第三个参数是 HandoffBehavior,而不是 FilllBehavior。
    • 我的回答中没有 BeginAnimation 的第三个参数。相反,它是 DoubleAnimation 构造函数的另一个参数。 FillBehavior.Stop 正是您所需要的。
    【解决方案2】:

    正如您在 MSDN 中的 here 中看到的,动画设置的值(排名 2)比本地值(排名 3)具有更高的优先级。如果要再次手动设置值,则必须先停止或删除动画。 (另请参阅本网站上的“强制、动画和基值”部分)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-01
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多