2010-11-22 7 views
0

キャンバスにある画像の左プロパティをアニメーション化しようとしています。Animate Canvas.Leftプロパティ

私がやっている:

image.SetValue(Canvas.LeftProperty, destX[i]); 

これが働いています。 しかし、ときに私がやっている:

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(image, lastValue, destX[i], 500); 

を私のアニメーション機能に間違っている可能性が何

を働いていないのですか? アニメーションが悪い場合でも、完了したイベントは良い値をcanvas.leftpropertyにリセットする必要があります。

私の場合、何かが間違っています。

どのようにアニメーション機能を実行しましたか?任意のヘルプ

答えて

0

を事前に

ありがとうございますCanvas.LeftPropertyを設定しているが、あなたはTranslateTransform.XPropertyをアニメーション化しています。これらは非常に異なるプロパティです。のレイアウトパスの後に変換変換が適用されるため、が適用されます。オブジェクトはCanvas.Leftを使用してキャンバスに配置されますが、TranslateTransformによって元の原点から移動されます。あなたがすべきことは、TranslateTransform.XPropertyをval2に戻すことです。

アニメーションが本当に途中で失敗してはならないので、この余分な予防措置が必要であってはならない、と述べた
myMovementStoryboard.Completed += (s, e) => 
      { 
       ts.X = val2; 
      }; 

+0

実際、canvas.leftプロパティをアニメーションしたいと思います。 Storyboard.SetTargetProperty(myDoubleAnimation、新しいPropertyPath(Canvas.LeftProperty))を使用するべきではありません。 ? TranslateTransform.XPropertyを使用する代わりに? (もちろん、試した後、引数の例外があります) – Tim

+0

Canvas.LeftPropertyをアニメーション化できるはずです。そのような場合にコードがどのように見えて、なぜ機能していないのかを理解する必要があります。この場合、ターゲットは「イメージ」になります。 –

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(); 
+0

私のためにStoryboard.SetTargetProperty(myDoubleAnimation、新しいPropertyPath( "(Canvas.Left)"));働いていませんでした。代わりに、私はStoryboard.SetTargetProperty(myDoubleAnimation、 "(Canvas.Left)")を使用しました。 OKと思われます。これが他の人にも役立つことを願っています... – SmartDev