2009-04-22 8 views
0

저는 Sells/Griffiths의 "Programming WPF"를 통해 WPF를 가르쳐 왔으며 훌륭한 리소스를 발견했지만 소개 한 개념 중 일부를 취하려고합니다. 나는 한 걸음 더 나아가려고 노력하고있는 것을 성취하기 위해 조각들을 모으는 방법에 관한 개념적 걸림돌로 뛰어 들어 가고있다.Animation 완료시 FrameworkElement 제거하기

이 연습에서는 자체 종료 애니메이션을 만들려고합니다. 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

나는 전에도 그 방향으로 생각하지 않았습니다. 감사. 그 일은 훌륭했습니다. –