2012. 1. 25. 17:13

일반적으로 트랜스폼은 블랜드에서 생성해서 쓰기 때문에 동적으로 생성할일이 많지는 않습니다.
하지만 동적으로 생성한 컨트롤에 트랜스폼을 주고 싶으면 동적으로 생성해야 하죠.

동적으로 트랜스폼을 주려면 2가지 방법이 있습니다.
한개만 지정하는 방법과 그룹으로 지정하는 방법이 있죠.

1개만 지정하는 방법은 컴포짓트랜스폼(CompositeTransform)을 이용합니다.
이 컴포짓트랜스폼은 4.0이후버전에서 사용하는데....이전 버전에서 사용가능한지 모르겠군요.

어찌됬건 컴포짓트랜스폼은 좌표이외에도 대부분의 트랜스폼 옵션을 사용할수 있기때문에 거의 컴포짓트랜스폼만 생성하면 별문제 없이 애니메이션 생성이 가능하죠.

이 포스팅에선 4.0이후 버전에서 1개만 지정하여 사용하는 방법을 알려드리겠습니다.


1개만 지정
한개만 지정할때는 랜드트랜스폼(RenderTransform)을 원하는 트랜스폼을 지정하면 됩니다.

아래예제는 X/Y 좌표를 수정할수 있는 컴포짓트랜스폼(CompositeTransform)을 지정하여 좌표를 수정하는 함수입니다.

애니메이션을 적용할 택스트 블록을 넘겨주면 대각선으로 오는 택스트블록을 볼수 있습니다.

private void Animaion(TextBlock txtTaget, double dBeginTime)
{
    Storyboard sbReturn = new Storyboard();

    EasingDoubleKeyFrame kf = null;

    DoubleAnimationUsingKeyFrames daX = null;
    DoubleAnimationUsingKeyFrames daY = null;

    daX = new DoubleAnimationUsingKeyFrames();
    daY = new DoubleAnimationUsingKeyFrames();

    txtTaget.RenderTransform = new CompositeTransform();

    Storyboard.SetTarget(daX, txtTaget);
    Storyboard.SetTargetProperty(daX, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateX)"));
    sbReturn.Children.Add(daX);
    Storyboard.SetTarget(daY, txtTaget);
    Storyboard.SetTargetProperty(daY, new PropertyPath("(UIElement.RenderTransform).(CompositeTransform.TranslateY)"));
    sbReturn.Children.Add(daY);

    sbReturn.BeginTime = TimeSpan.FromSeconds(dBeginTime);

    //1.시작위치로 변경
    kf = new EasingDoubleKeyFrame();
    kf.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0));
    kf.Value = -50;
    daX.KeyFrames.Add(kf);
    kf = new EasingDoubleKeyFrame();
    kf.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0));
    kf.Value = -50;
    daY.KeyFrames.Add(kf);

    //2.목적지 지정
    kf = new EasingDoubleKeyFrame();
    kf.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5));
    kf.Value = 0;
    daX.KeyFrames.Add(kf);
    kf = new EasingDoubleKeyFrame();
    kf.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0.5));
    kf.Value = 0;
    daY.KeyFrames.Add(kf);

    //애니메이션 시작
    sbReturn.Begin();
}