2010-02-09 2 views
4

내가 만든 사용자 정의 컨트롤에 플립 애니메이션을 추가하려고합니다. 사용자 컨트롤은 87x87 이미지의 앞면과 뒷면과 일부 속성이있는 간단합니다. 재미있는 게임에서 타일을 표현한다고 가정합니다. 나는 갑판에서 타일을 골라내는 플립 효과에 애니메이션을 적용하려고합니다. 두 가지 이유로 xaml 대신 코드를 통해이 작업을 수행해야한다고 느낍니다. 1. 타일이 뒤집 으면서 (현재 작업중 인) 타일을 뒤집은 후 다른 변환이 수행됩니다. 2. 타일이 뒤집힌 후 이벤트를 언 Hook하려고합니다.코드 WPF로 완전히 뒤집기 애니메이션 수행

내가 얻는 문제는 메서드가 종료 된 후에 마지막 애니메이션 만 실행된다는 것입니다. 나는 이미지 중반 스토리 보드를 변경하고, 내가 오프이 일하고있다 될하기 위해 targetProperty을 설정 무엇을 어떻게

을 : 나는 스토리 보드 그러나 나는 보았다 두 가지 방법으로 저를 혼동 모든 예제를 필요가 있다고 생각 두 개의 블로그.

http://www.codeguru.com/csharp/csharp/cs_misc/userinterface/article.php/c12221 http://blogs.msdn.com/tess/archive/2009/03/16/silverlight-wpf-flipimage-animation.aspx

public void FlipFront() 
    { 
      DoubleAnimation flipfront = new DoubleAnimation(0, 90, new Duration(new  TimeSpan(0, 0, 1))); 
     SkewTransform skew = new SkewTransform(); 
     this.RenderTransform = skew; 
     skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront);   


    } 

    public void FlipBack() 
    { 

     ImageSourceConverter source = new ImageSourceConverter(); 
     this.ImageFace.Source = new BitmapImage(new Uri("Back.jpg", UriKind.Relative)); 

     DoubleAnimation flipfront = new DoubleAnimation(90, 0, new Duration(new TimeSpan(0, 0, 1))); 
     SkewTransform skew = new SkewTransform(); 
     this.RenderTransform = skew; 
     skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
    } 

    public void Flip() 
    { 
     FlipFront(); 
     FlipBack(); 
    } 

는 나는 내가 경험하고있는 문제를 해결하는 데 도움 것이라고 나는 생각하기 때문에 두 개의 별도의 방법으로 플립 끊었다.

답변

1

와우,이이 하나의 추적 그냥 경우 사람에 ... 룽 시간에 업데이트되지 않은 : 직전에 완료하는 데 문제는 당신이 "플립 앞"기다리고하지 않을 것입니다

애니메이션 플립 백 (flip back)을 시작합니다. 기본적으로 Y 앵글 애니메이션을 즉시 90도까지 강제 점프하기 때문에, 제대로 발사되지 않는 것처럼 보입니다.

이 문제를 해결할 수있는 방법이 많이 있습니다. 가장 먼저 떠오르는 점은 DoubleAnimation에는 CreateClock이라는 메서드가있어서 AnimationClock 개체를 반환합니다. 그 오브젝트는 그것에 Completed 이벤트를 가지고 있는데, 애니메이션이 "완료"되었을 때 알려줍니다. 핸들러를 붙이십시오 (메모리가 누출되지 않도록 분리해야 함을 기억하십시오). "뒤집기 시작"메서드를 호출하십시오. 나는 매우 비효율적 인 어떤 것을 던져 왔지만 원리를 보여줄 것입니다 :

public AnimationClock StartFlipFrontAnimation() 
{ 
    this.ImageFace.Source = _frontFace; 
    DoubleAnimation flipfront = new DoubleAnimation(0, 90, new Duration(new TimeSpan(0, 0, 3))); 
    SkewTransform skew = new SkewTransform(); 
    this.RenderTransform = skew; 
    skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
    return flipfront.CreateClock(); 
} 

public AnimationClock StartFlipBackAnimation() 
{ 
    this.ImageFace.Source = _backFace; 
    DoubleAnimation flipfront = new DoubleAnimation(90, 0, new Duration(new TimeSpan(0, 0, 3))); 
    SkewTransform skew = new SkewTransform(); 
    this.RenderTransform = skew; 
    skew.BeginAnimation(SkewTransform.AngleYProperty, flipfront); 
    return flipfront.CreateClock(); 
} 

public void BeginFlip() 
{  
    var frontClk = StartFlipFrontAnimation();  
    frontClk.Completed += FrontFlipDone;   
} 

private void FrontFlipDone(object sender, EventArgs args) 
{ 
    var clk = sender as AnimationClock; 
    if(clk != null) 
    { 
     clk.Completed -= FrontFlipDone; 
    } 
    var backClk = StartFlipBackAnimation(); 
}