문제

XAML에서 스토리 보드를 제거하려면 (즉, Datatrigger에서 Removestoryboard 동작) 애니메이션 값을 유지하려면 어떻게해야합니까? 와 비슷합니다 애니메이션:

애니메이션의 Begintime이 Null이면 현재 애니메이션이 제거되고 속성의 현재 가치가 유지됩니다.

도움이 되었습니까?

해결책

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));

  }
}

애니메이션 값을 복사하려면 스토리 보드를 제거하기 직전 에이 문제를 해결하십시오.

편집하다 Begintime = NULL로 시작 분석을 호출하는 것도 비슷한 효과를 얻기 때문에이 코드는 불필요 할 수 있다고 의견이 제기되었습니다.

begintime = null을 사용한 beginimation이 값이 로컬에 복사 된 것처럼 보이게하는 것은 사실이지만, 나중에 removestoryboard 로의 호출은 값이 되돌아갑니다. 이것은 begintime = null을 사용한 시작 애니메이션으로 인해 이전 애니메이션이 새로운 애니메이션의 시작을 보류 할 때 값을 유지하지만 로컬 값에 영향을 미치지 않기 때문입니다.

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

다른 팁

사용할 때 비슷한 문제가있었습니다 AnimationTimeline. 가장 쉬운 솔루션은 캡처하는 것으로 판명되었습니다 Completed 전화하기 전에 코드로 이벤트 BeginAnimation 이랑 null 매개 변수 애니메이션을 제거하려면 속성의 현재 값을 가져 와서이를 설정합니다.

이것은 마지막 애니메이션 값을 얻고 설정합니다.

void OnCompleted( object sender, EventArgs args )
{
    // Required to copy latest animated value to local value.
    o.SomeValue = o.SomeValue;
    o.BeginAnimation( SomeClass.SomeValueProperty, null );
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top