2009-11-05 4 views

답변

4

RemoveStoryboard의 주요 용도는 애니메이션 값을 제거하고 애니메이션이 적용되지 않은 상태로 다시 설정하는 것입니다. 대부분의 경우 특정 상황에 따라 대신 PauseStoryboard 또는 StopStoryboard로 통화를 전환 할 수 있습니다. 유일한 예외는 스토리 보드가 보유한 리소스를 확보하거나 다른 용도로 사용해야하는 경우입니다.

스토리 보드를 제거하고 속성 값을 유지하려면 속성에 직접 애니메이션 값을 설정해야합니다. 이것은 다음과 같이 애니메이션 값으로 뭔가를 각 값을 설정하여 수행 할 수 있습니다

void CopyAnimatedValuesToLocalValues(DependencyObject obj) 
{ 
    // Recurse down tree 
    for(int i=0; i<VisualTreeHelper.GetChildrenCount(obj); i++) 
    CopyAnimatedValuesToLocalValues(VisualTreeHelper.GetChild(obj, i)); 

    var enumerator = obj.GetLocalValueEnumerator(); 
    while(enumerator.MoveNext()) 
    { 
    var prop = enumerator.Current.Property; 
    var value = enumerator.Current.Value as Freezable; 

    // Recurse into eg. brushes that may be set by storyboard, as long as they aren't frozen 
    if(value!=null && !value.IsFrozen) 
     CopyAnimatedValuesToLocalValues(value); 

    // *** This is the key bit of code *** 
    if(DependencyPropertyHelper.GetValueSource(obj, prop).IsAnimated) 
     obj.SetValue(prop, obj.GetValue(prop)); 

    } 
} 

전화하면 전에이 권리는 애니메이션 값을 복사 할 스토리 보드를 제거합니다.

BeginAnimation을 BeginTime = null과 함께 호출하면 비슷한 효과가 발생하므로이 코드가 필요하지 않을 수 있다는 의견이있었습니다.

BeginTime = null 인 BeginAnimation이 값이 로컬에 복사 된 것처럼 보이지만 나중에 RemoveStoryboard를 호출하면 값이 되돌아갑니다. BeginAnimation이 BeginTime = null 인 경우 이전 애니메이션이 새 애니메이션의 시작을 보류하고 값을 보유하지만 로컬 값에 영향을 미치지는 않습니다.

위의 코드는 실제로 로컬 값을 덮어 쓰므로 모든 애니메이션을 제거 할 수 있으며 개체는 여전히 새로운 값을 갖습니다. 따라서 RemoveStoryboard를 호출하고 여전히 값을 유지하려면 위에 쓴 코드 나 그와 비슷한 코드가 필요합니다.

+0

나는 내 질문에 언급했듯이 XAML에서 그 내용을 원합니다. 주요 목표는 현재 값으로 시작하는 DataTrigger를 기반으로 새 애니메이션을 시작하는 것입니다. AFAIK는 현재 스토리 보드를 일시 중지하거나 중지하면 현재 값을 유지하거나 재설정 할 수 없으므로이를 달성 할 수 없습니다. WPF에서는 코드가 필요하지 않습니다. BeginTime이 null로 설정된 애니메이션으로 Animatable.BeginAnimation을 간단하게 호출 할 수 있습니다. 값이 로컬에 복사되는 것과 동일한 효과를 갖습니다. – bitbonk

+0

나는 당신의 필요를 이해하고 있는지 잘 모르겠습니다. 새로운 애니메이션을 시작하기를 원한다면 RemoveAnimation 액션을 전혀 호출하지 않고 그렇게하지 않는 이유는 무엇입니까? WPF는 해당 상황에서 현재 값으로 시작하도록 설계되었습니다. 그렇게하지 않습니까? –

+0

BeginTime = null로 BeginAnimation을 호출하면 내 코드와 동일한 효과가 발생한다는 것은 사실이 아닙니다. 구체적으로는 로컬에 값을 복사하지 않습니다. BeginTime = null로 BeginAnimation을 호출하고 나중에 RemoveAnimation을 호출하면 로컬 값이 변경되지 않아 값이 원래 값으로 되돌아갑니다.하지만 내 코드를 사용하면 값이 실제로 로컬에 복사되기 때문에 값이 고정됩니다. RemoveAnimation 후에도 로컬 값을 유지하는 데 필요한 것이 무엇인지 설명하고 있었고 필자가 필요하다고 쓴 코드를 설명했습니다. 말이 돼? –

1

AnimationTimeline을 사용할 때 비슷한 문제가 발생했습니다. 가장 쉬운 해결책은 Completed 이벤트를 코드 숨김으로 캡쳐하고 BeginAnimationnull 매개 변수로 호출하기 전에 애니메이션을 제거하고 속성의 현재 값을 가져 와서 설정하는 것이 가장 쉬운 해결책으로 밝혀졌습니다.

마지막으로 애니메이션 된 값을 가져 와서 설정합니다.

void OnCompleted(object sender, EventArgs args) 
{ 
    // Required to copy latest animated value to local value. 
    o.SomeValue = o.SomeValue; 
    o.BeginAnimation(SomeClass.SomeValueProperty, null); 
} 
관련 문제