2011-08-04 7 views
2

昨日私は答えを得ることに失敗しましたが、おそらく私は正しい質問を定式化するのに十分な深さの問題を理解していませんでした。ストーリーボードアニメーションの不具合?

ストーリーはListBoxの高さをアニメーション化することです。ここでは、その後のスクリーンショットです:

a)の "ミディアム" のTextBlock

Image1

Bである) "中" のTextBlockはリストボックスに置き換えられます。ユーザが項目を選択する。 ListBox.Heightのアニメーションが開始されます。アニメーションが完了すると、ListBoxは元のTextBlockに置き換えられます。 (データの違いを無視してください。画像のコレクションは、私がレンダリングされたフレームで動作しなければならなかったpainfullプロセスであった。画像の一つが異なるレコードに対して撃たれました。)

Img2Img3Img4

このシーケンス時折ちらつきがある。私は何が起こっているのか知りたかったし、しばらくした後、私はこのスクリーンショットを得た:

Img5

何あなたが見ることStoryboard.Completedイベントがインターセプトされた後の最初のフレームです。これまでのところ、これはストーリーボードの最終結果です。

注:

  • 私はこの瞬間にビジュアルツリーをチェックしsuspiceous何かを見つけることができませんでした。

  • これは、発生する効果の1つに過ぎません。別のケースでは、青いハッチングでリサイズされた1行のListBoxが頻繁に使用されます。この場合、リストボックスの上のすべての要素が消えます。第3の可能性は、画面全体にわたって斜めの赤線である。ここで

ストーリーボードを定義するコードです:

private Storyboard GetDropDownAnimation(double from, double to) 
    { 
     double secs = this.IsExpanded ? 0.2 : 0.4; 
     CubicEase ease = new CubicEase() { EasingMode = EasingMode.EaseInOut }; 
     DoubleAnimation animation = new DoubleAnimation() 
     { 
      Duration = new Duration(TimeSpan.FromSeconds(secs)), 
      From = from, 
      To = to, 
      FillBehavior = FillBehavior.HoldEnd, 
      EasingFunction = ease 
     }; 
     Debug.WriteLine("Animation Height {0} -> {1}", from, to); 

     Storyboard.SetTarget(animation, this); 
     Storyboard.SetTargetProperty(animation, new PropertyPath("Height")); 

     Storyboard sb = new Storyboard(); 
     sb.Children.Add(animation); 
     return sb; 
    } 

私が(長い間、私は問題があることを確信していた)行って、それは問題の懸念のように見える他のトリックを説明できますアニメーション自体のみ。

何が起こっているのか説明できますか?

答えて

2

Have a look at these before you continue this way it might make your life a bit easier :)

前記、アニメーション(から)の開始値を見て、それが正しいかどうかを確認します。

その他すべてが失敗した場合は、完全に透過的なリストボックスから開始できます。

+1

あなたはこれらを意味すると思いますか? http://silverlight.codeplex.com/ –

+0

@ClausJørgensen、はい、ありがとう!私の方法は古い。私はリンクを更新しました。 –

+0

私は何が私の頭に来たのかをすべて調べました。 /からアニメーション値が出力をデバッグするために印刷された、私はビジュアルツリーなどをダンプした。間違った "from"値は観測された効果を説明できませんでした。 –

0

私は報告する価値があるかもしれない問題についていくつかの進歩を遂げました。

最初は、ストーリーボードを自分のアニメーションで置き換えました。 CompositionTarget.Renderingコールバックを使用して始めました。コードはかなり簡単です:コールバックでは、ListBoxの高さを経過時間に比例して更新する必要があります。私は、高さの変更ごとに1つのLayoutUpdatedイベントがあることを再確認しました。つまり、画面は常に同期しています。 (楽しい驚き。)

結果:ちらつきが残っていました。

結論:ストーリーボードは無実です。

興味深いものが見つかりました: 高さの操作が私の手の中にあったので、私は単純に行の高さの倍数に値を丸めました。そして、何が起こったのか想像してみてください。

注意ListBoxは、文字列プロパティを参照するItemsSourceおよびDisplayMemberPathを使用して設定されています。 ItemTemplateが設定されていません。言い換えれば、かなり標準的なListBoxの使用です。

これは答えではありませんが、私は知っていますが、それは興味深いことがわかります。

+0

明らかにアイテムが「フィット」していないときは、リストボックスからドロップすると、ItemsContainerテンプレートが壊れていることになります。 –

+0

壊れたテンプレートの意味がわからない私はあらかじめ定義されたテンプレートで標準ListBoxを使用しています。 –

+0

私は再び間違っている可能性が非常に高いです。その間、私はちらつきが消えず、極端に稀になったことを発見しました。そして、それはアニメーションステップの数が限られているためです。 –