2012-10-05 2 views
5

에 대한 전환을 생성 할 수 없습니다 :VisualStateManager 나는 다음과 같은 시각적 상태가 정의한 ThicknessAnimations

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup Name="EditStates"> 

     <VisualStateGroup.Transitions> 
      <VisualTransition GeneratedDuration="0:0:2"/> 
     </VisualStateGroup.Transitions> 

     <VisualState Name="Editing" />       
     <VisualState Name="Normal"> 
      <Storyboard> 
       <ThicknessAnimation Storyboard.TargetName="ViewBorder" Storyboard.TargetProperty="Margin" To="0" Duration="0"/> 
       <DoubleAnimation Storyboard.TargetName="Header"  Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(ScaleTransform.ScaleY)" To="0" Duration="0"/> 
       <ColorAnimation  Storyboard.TargetName="EditBorder" Storyboard.TargetProperty="Background.Color" To="Red" Duration="0"/> 
      </Storyboard> 
     </VisualState>           

    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

DoubleAnimationColorAnimation 작업 벌금을, 그 2 초 동안 VisualStateManager 생성 전이 애니메이션으로.

그러나 ThicknessAnimation은 움직이지 않습니다. 대신 전환 기간이 끝날 때 완료 값에 스냅됩니다.

VisualStateManager에 전환을 생성하는 방법이 있습니까? 아니면 수동 전환을 제공해야합니까?

+0

나는 똑같은 것으로 나타났습니다. 시각적으로 Blend를 사용하여 가장자리를 드래그하면 RenderTransform을 사용하여 내부적으로 작동합니다. 손으로 여백을 수정하는 것과 같은 효과가 있습니다. 나는 버그이거나 구현 된 기능이 아닌 것 같아요. – Wouter

답변

2

나는 문제를 분석하고 .NET Reflector을 발사하고 VisualStateManager는 다음과 같은 애니메이션을 지원하는 것을 발견

  • ColorAnimation
  • DoubleAnimation
  • PointAnimation

아무 데서도 문서화되지 않았기 때문에 다소 엉터리입니다.

애니메이션을 생성 할 수 없다는 것을 증명하려면 VisualStageManager.GenerateToAnimation 메서드의 반대 코드를 살펴보십시오. 동일한 애니메이션 하위 세트를 지원하는 VisualStageManager.GenerateFromAnimation도 있습니다.

private static Timeline GenerateToAnimation(FrameworkElement root, Timeline timeline, IEasingFunction easingFunction, bool isEntering) 
{ 
    Timeline destination = null; 

    if (destination == null) 
    { 
    var targetColor = GetTargetColor(timeline, isEntering); 
    if (targetColor.HasValue) 
     destination = new ColorAnimation { To = targetColor, EasingFunction = easingFunction }; 
    } 

    if (destination == null) 
    { 
    var targetDouble = GetTargetDouble(timeline, isEntering); 
    if (targetDouble.HasValue) 
     destination = new DoubleAnimation { To = targetDouble, EasingFunction = easingFunction }; 

    } 

    if (destination == null) 
    { 
    var targetPoint = GetTargetPoint(timeline, isEntering); 
    if (targetPoint.HasValue) 
     destination = new PointAnimation { To = targetPoint, EasingFunction = easingFunction }; 
    } 

    if (destination != null) 
    CopyStoryboardTargetProperties(root, timeline, destination); 

    return destination; 
} 

바텀 라인 ... VisualStageManager에서만 컬러, 더블 또는 포인트 애니메이션을 사용할 수 있습니다. 다른 것을 필요로하면 구식 트리거로 되돌립니다 ...

+0

성가신하지만 유용합니다! 건배. – GazTheDestroyer

0

아마도 ThicknessAnimation 문이 완전하지 않을 수 있습니다. MSDN의 코드 샘플 "ThicknessAnimation Class"를 검색합니다. 이 당신을 도울 수

<ThicknessAnimation 
        Storyboard.TargetProperty="BorderThickness" 
        Duration="0:0:1.5" FillBehavior="HoldEnd" From="1,1,1,1" To="28,14,28,14" /> 

희망 ...

+0

고마워요,하지만 불행히도 이것은 애니메이션입니다. VisualStates는 알려진 상태를 설정하기 때문에 정적 스토리 보드가 필요합니다. 위의 내용을 전환으로 정의 할 수 있지만 이것이 피하려고하는 것입니다. – GazTheDestroyer

+0

OK, 지금은 분명합니다. –