2009-04-22 10 views
0

私は、Sells/Griffithsの「Programming WPF」を通してWPFを自分自身で教えてきました。私は素晴らしいリソースを見つけましたが、導入した概念のいくつか私はもう一歩進んで、私がしようとしていることを達成するために作品をまとめる方法についての概念的な問題にぶつかっています。アニメーション完了時にFrameworkElementsを削除する

この練習では、自己終了アニメーションを作成しようとしています。 FrameworkElementは、イベントによって作成され、アニメーションを実行してから削除します。私は、アニメーションからのFrameworkElement親にコールバックする方法を見つけ出すことに問題があります。完成したイベント。

私はこの質問にもともとDoubleAnimationを使用していましたが、それは含まれておらず、Storyboardの一部ではありませんでした。以来、私はStoryboardを追加して、Storyboardと矩形のリソースを作りましたので、簡単に再利用できます。ここで

は、私がこれまで持っているものです:
の.xaml:

<Window.Resources> 
    <Storyboard x:Key="GrowSquare" x:Shared="False"> 
     <DoubleAnimation Storyboard.TargetProperty="(Canvas.Top)" By="-50" Duration="0:0:2"/> 
     <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" By="-50" Duration="0:0:2"/> 
     <DoubleAnimation Storyboard.TargetProperty="(Ellipse.Width)" By="100" Duration="0:0:2"/> 
     <DoubleAnimation Storyboard.TargetProperty="(Ellipse.Height)" By="100" Duration="0:0:2"/> 
    </Storyboard> 
    <Rectangle x:Key="MyRect" x:Shared="False" Width="20" Height="20"> 
    </Rectangle> 
</Window.Resources> 
<Canvas x:Name="myCanvas" MouseMove="myCanvas_MouseMove" Background="White"/> 

は.cs:

public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 
      lastFire = DateTime.Now; 
     } 

     DateTime lastFire; 

     private void myCanvas_MouseMove(object sender, MouseEventArgs e) 
     { 
      DateTime nowTime = DateTime.Now; 
      TimeSpan T = nowTime.Subtract(lastFire); 

      if (T.TotalMilliseconds > 200) 
      { 
       lastFire = nowTime; 
       Random Rand = new Random(); 

       Rectangle myRect = (Rectangle)FindResource("MyRect"); 
       myRect.Fill = new SolidColorBrush(Color.FromRgb((byte)Rand.Next(256), (byte)Rand.Next(256), (byte)Rand.Next(256))); 
       Point myLoc = e.GetPosition(myCanvas); 
       Canvas.SetLeft(myRect, myLoc.X - 10); 
       Canvas.SetTop(myRect, myLoc.Y - 10); 
       myCanvas.Children.Add(myRect); 

       Storyboard SB = (Storyboard)FindResource("GrowSquare"); 
       SB.Completed += new EventHandler(SB_Completed); 
       SB.Begin(myRect); 
      } 

     } 

     void SB_Completed(object sender, EventArgs e) 
     { 
      myCanvas.Children.RemoveAt(0); 
     } 
    } 

これは動作しますが、方法で、私はそれをたいと思いません。キャンバスは空で、すべてのアニメーションは同じ長さなので、アニメーションが終了すると、キャンバスの最初の子で呼び出されたアニメーションになります。

しかし、私は、アニメーションが常に同じ順序で開始および終了するとは限らないことを意味するランダムな時間を取るアニメーションを実装したいと思います。何とかSB_Completedイベントで、呼び出されたコントロールにアクセスしたいのですが、まだそのパスを見つけることができないようです。

アニメーションが呼び出されているコントロールにSB_Completedイベントを呼び出すMedia.Animation.ClockGroupから取得する方法はありますか?

答えて

3

変更しますが、これにイベントハンドラを割り当てるライン:

SB.Completed += (s,e) => myCanvas.Children.Remove(myRect); 
+0

は私も前にその方向で考えていませんでした。ありがとう。それは素晴らしい仕事でした。 –

関連する問題