2009-04-22 96 views
0

我一直在通過Sells/Griffiths的「Programming WPF」教我自己的WPF,並且我發現它是一個很好的資源,但是我正在嘗試引入他們介紹的一些概念我走得更遠了,我正陷入一個概念上的障礙,就是如何把這些碎片拼湊起來,以完成我正在嘗試做的事情。在動畫完成時刪除FrameworkElements

在本練習中,我試圖創建自行終止的動畫;由事件創建的FrameworkElement,執行動畫,然後刪除它們自己。我在解決如何從animation.Completed事件回調父FrameworkElement時遇到問題。

我問這個問題最初只是使用DoubleAnimation s是不包含的,而不是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事件中,我想訪問它被調用的控件,但我似乎無法找到它的路徑。

有沒有辦法從Media.Animation.ClockGroup中調用SB_Completed事件到動畫被調用的控件上?

回答

3

變化,你事件處理函數分配到該行:

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

我甚至沒有在這個方向前思考。謝謝。這很好。 – 2009-04-28 19:58:38