2009-10-17 8 views
2

Silverlight에는 두 값을 보간하는 함수를 지정할 수있는 EasingFunction이라는 애니메이션 타임 라인 (DoubleAnimation 등)에 대한 속성이 있습니다. .NET 4에서 나오지만 3.5로 포팅하고 싶습니다. this을 읽은 후에는 꽤할만한 것으로 보이지만 이상한 문제가 있습니다.WPF 애니메이션 클래스를 확장하는 신비

그래서 같은 DoubleAnimation 확장하고 있습니다 : 그것은 새로운 속성을 추가하는 것보다 다른 흥미로운 아무것도 아니라고

class EasingDoubleAnimation : DoubleAnimation 
{ 
    protected override Freezable CreateInstanceCore() 
    { 
     return new EasingDoubleAnimation(); 
    } 

    protected override double GetCurrentValueCore(double defaultOriginValue, double defaultDestinationValue, AnimationClock animationClock) 
    { 
     Debug.WriteLine(animationClock.CurrentProgress.Value); 
     return base.GetCurrentValueCore(defaultOriginValue, defaultDestinationValue, animationClock); 
    } 

    public EasingFunctionBase EasingFunction 
    { 
     get { return (EasingFunctionBase) GetValue(EasingFunctionProperty); } 
     set { SetValue(EasingFunctionProperty, value); } 
    } 

    public static readonly DependencyProperty EasingFunctionProperty = 
     DependencyProperty.Register("EasingFunction", typeof(EasingFunctionBase), typeof(EasingDoubleAnimation), 
      new PropertyMetadata(null)); 
} 

참고.

그리고 나는 몇 가지 코드에서 사용할 수 있습니다 :

Storyboard sb = new Storyboard(); 
EasingDoubleAnimation ease = new EasingDoubleAnimation(); 
//ease.EasingFunction = new BackEase(); 
Storyboard.SetTarget(ease, MyTarget); 
Storyboard.SetTargetProperty(ease, new PropertyPath("(Canvas.Left)")); 
ease.To = 100; 
ease.Duration = TimeSpan.FromSeconds(3); 
sb.Children.Add(ease); 
sb.Begin(); 

그 코드는 잘 애니메이션을 실행합니다.

그러나 EasingFunction을 설정하는 줄의 주석을 제거하면 애니메이션이 더 이상 실행되지 않습니다. 내 CreateInstanceCore 메서드가 호출되지만 GetCurrentValue는 호출되지 않습니다. 기묘한?

답변

1

여기 어둠 속에서 쏜다. 속성 유형을 단순 유형 (int/string)으로 변경해보십시오. 나는 그것이 귀하의 부동산 유형이 EasingFunctionBase이고 귀하가 그 인스턴스를 동결하려고하고 있다는 사실과 관련이 있다고 생각합니다.

+0

게시하기 전에 실제로 실험 해 보았습니다. 간단한 속성 유형을 사용하는 한 모든 것이 정상적으로 작동한다는 것을 알았습니다. Freezable 객체에는 복잡한 속성 유형을 사용할 수없는 것 같습니다. "Silverlight 3는 어떻게 작동합니까?" 나는 물었고 Reflector에서 SL3의 DoubleAnimation은 실제로 WPF 에서처럼 Freezable이 아니라는 사실을 알게되었습니다. 내가 분명히하고 싶은 일을 내가 할 수 없을 것처럼 보입니다. –

+0

EasingFunctionBase를 Freezable로 설정하지 않는 한. 그렇다면 나중에는 속성을 변경할 수 없지만 작동하지만 내 경우에는 괜찮을 수 있습니다. 답장을 보내 주셔서 감사합니다. –