2011-07-29 23 views
4

私は次のコードを書いています。 500msの ストーリーボードをフェードイン、一時停止、フェードアウト(コードを介して)するにはどうすればよいですか?

  • のポーズは500ms
  • ためフェードアウト

  • 1000ミリ秒のためではなく、実行時に、その後のSystem.InvalidOperationExceptionを得るためで

    1. フェード:それは次のことを行いストーリーボードを作成しよう次の出力で表示します。

      Additional information: Multiple animations in 
          the same containing Storyboard cannot target the 
          same property on a single element. 
      

      これは、すべてのアニメーションを実行しようとしているようです順番にではなくすぐにオンにします。

      private Storyboard createStoryboard() 
      { 
          Storyboard board = new Storyboard(); 
      
          addFadeToStoryboard(board, 0, 1, 500); 
          addFadeToStoryboard(board, 1, 1, 1000); 
      
          DoubleAnimation fadeOut = addFadeToStoryboard(board, 1, 0, 500); 
      
          fadeOut.Completed += new EventHandler(onFadeCompleted); 
      
          Storyboard.SetTarget(board, this); 
      
          return board; 
      } 
      
      private DoubleAnimation addFadeToStoryboard(Storyboard board, 
          double fadeFrom, double fadeTo, double milliseconds) 
      { 
          DoubleAnimation fade = new DoubleAnimation() 
          { 
          Duration = new Duration(TimeSpan.FromMilliseconds(milliseconds)), 
          From = fadeFrom, 
          To = fadeTo, 
          RepeatBehavior = new RepeatBehavior(1) 
          }; 
      
          Storyboard.SetTargetProperty(fade, 
          new PropertyPath(UIElement.OpacityProperty)); 
      
          board.Children.Add(fade); 
      
          return fade; 
      } 
      

      どのように順次にすることができますか?私はストーリーボードの基本的な何かを誤解していますか?

      おかげ

  • 答えて

    0

    私は自分のシーケンサークラスを作成してこれを解決しました。 LinkedListクラスに依存しているため、このコードを使用する場合は標準のクラスに置き換える必要があります:

    using System; 
    using System.Windows.Media.Animation; 
    
    namespace YourNamespace 
    { 
        // An object that contains multiple storyboards, and fires off 
        // subsequent ones as they finish. 
    
        public class StoryboardSequencer 
        { 
        public StoryboardSequencer() 
        { 
        } 
    
        public void add(Storyboard board) 
        { 
         m_boards.add(board); 
         board.Completed += new EventHandler(onBoardCompleted); 
        } 
    
        // Starts the storyboard from the first. 
        // If already started, this call is ignored. 
        public void begin() 
        { 
         if (m_boards.size() > 0) 
         { 
         m_currentBoardIndex = 0; 
         beginCurrentBoard(); 
         } 
         else 
         { 
         onLastBoardCompleted(); 
         } 
        } 
    
        // Stops and rewinds. 
        // Does not call completed handler. 
        public void stop() 
        { 
         if (m_currentBoardIndex != -1) 
         { 
         Storyboard board = m_boards.get(m_currentBoardIndex); 
         if (board != null) 
         { 
          board.Stop(); 
         } 
    
         m_currentBoardIndex = -1; 
         } 
        } 
    
        private void beginCurrentBoard() 
        { 
         Storyboard board = m_boards.get(m_currentBoardIndex); 
         if (board == null) 
         { 
         onLastBoardCompleted(); 
         } 
         else 
         { 
         board.Begin(); 
         } 
        } 
    
        // Triggered when the sequence completes. 
        public event EventHandler Completed; 
    
        private void onBoardCompleted(object sender, EventArgs e) 
        { 
         m_currentBoardIndex++; 
    
         if (m_currentBoardIndex >= m_boards.size()) 
         { 
         onLastBoardCompleted(); 
         } 
         else 
         { 
         beginCurrentBoard(); 
         } 
        } 
    
        private void onLastBoardCompleted() 
        { 
         m_currentBoardIndex = -1; 
         Completed.Invoke(this, null); 
        } 
    
        private LinkedList<Storyboard> m_boards = new LinkedList<Storyboard>(); 
    
        // The current storyboard playing, or -1 if none. 
        private int m_currentBoardIndex = -1; 
        } 
    } 
    
    3

    ストーリーボードは、それらすべてが同時に開始し、同時に実行し得る複数のアニメーションが含まれている場合。 DoubleAnimationsのBeginTimeプロパティをTimeSpanに設定して、開始するタイミングを指定することができます。これにより、すべての以前のアニメーションの累積時間を渡すことで、連続効果を得ることができます。

    編集:申し訳ありません - 私はSilverlightタグに気付きました。私の答えはWPFで動作します...私はSilverlightとWPFアニメーションの違いについてはわかりません。

    Thisが参考になる場合があります。それはWPFとSilverlightの違いだと思われます。 WPFが同じストーリーボード内の異なるアニメーションで同じプロパティをアニメートすることができる場所では、Silverlightは動作しません。別々のDoubleAnimationsを使用する代わりに、単一のDoubleAnimationUsingKeyFramesを使用することをお勧めします。個々のアニメーションは、その中のキーフレームになり、それらの間で線形にアニメートする必要があります。

    +0

    恐れることはありません。これはSLにも関連しています。 :) –

    +0

    私はBeginTimeを試しましたが、同じエラーが発生しました。他のアイデア?連続したアニメーションを行う正しい方法は何ですか?完了したイベントハンドラを介してそれらを一緒にストリングし、自分のコードに状態変数を付ける必要がありますか? – swinefeaster

    +0

    答えの最後に追加したリンクを見ましたか?あなたがやっていることに似ています...それは銀色です。 ;-) – IanR

    関連する問題