2011-08-28 10 views
2

私のコントロールを回転させるアニメーションを作成しましたが、トリガートのときは最終位置にジャンプしてただちに開始位置に戻ります。WP7 - アニメーションが早すぎると効果が残りません。

コントロールは後ろコードから作られ、以下の特性を有するテキストボックスされている。

FontSize = 45; 
TextAlignment = TextAlignment.Center; 
Widh = 40; 
Heigh = 45; 

Iは、アレイ内のテキストボックスを格納するので、私は次のコードでアニメーションをトリガーする:

foreach (TextBlock b in arrayOfTextBoxes) 
{ 
    Rotate(b); 
} 

アニメーション:

public static void Rotate(UIElement target) 
{ 
     var projection = new PlaneProjection(); 
     target.Projection = projection; 

     DoubleAnimation da = new DoubleAnimation(); 
     da.From = 0; 
     da.To = 90; 
     da.Duration = TimeSpan.FromSeconds(0.25); 
     da.AutoReverse = false; 

     Storyboard.SetTargetProperty(da, new PropertyPath(PlaneProjection.RotationZProperty)); 
     Storyboard.SetTarget(da, projection); 

     Storyboard sb = new Storyboard(); 
     sb.Children.Add(da); 

     EventHandler eh = null; 
     eh = (s, args) => 
     { 
      projection.RotationZ = 90; 
      sb.Stop(); 
      sb.Completed -= eh; 
     }; 
     sb.Completed += eh; 

     sb.Begin(); 
} 

EDIT:今私はpropably問題が何であるか知っている。 Dispatcher Timesはバックグラウンドで毎秒1回(時には2回)ディスカッションします。私がそれらを無効にすると、probleはなくなりました。しかし、私は時間を測定する必要があるので、私はそれを行うことはできません。 アニメーションをトリガーする直前にそれらを停止し、それらを再び開始することは役に立たない。 // DispetcherTimersは、次の操作を行います。「彼らが停止されるまで、」

 void tikac_Tick(object sender, EventArgs e) 
    { 
     herniCas += new TimeSpan(0, 0, 1); 
    } 

+0

あなたの質問に答えがありません。ちょっとした提案です:あなたは 'EventHandler eh' varを作成する必要はありません。代わりに匿名デリゲートを使うことができます。 – jv42

+2

@ jv42: 'eh'変数を使用するパターンは、実行後にデリゲートをイベントから削除できるため、一般的には良い方法です。 – AnthonyWJones

+0

ちょうど確かめて、あなたはアニメーションの期間が非常に速いIEの四分の一になることを意図します。最終的な位置へのジャンプは、非常に速くアニメーション化された後、ストーリーボードが完了したイベントを実行するだけではないのですか? –

答えて

2

アニメーションの絵コンテは、通常は最後の値を保持します。彼らは実際のプロパティ値を永久に変更するものではありません。彼らは現在のレンダリングされた値を変更します(素晴らしい依存プロパティではありません:))

終了時に明示的に停止するので、値は元の値に戻ります。ストーリーボードを停止しないでください。値を変更したままにするか、アニメーションが変更されたときにコードに明示的に設定します。

例のアニメーションは非常に速く終了しています(ストーリーボードの起動時間は数フレームになる可能性があり、アニメーションはフレーム固有ではなく固定時間の補間であるためスキップされます)。

関連する問題