2012-10-05 4 views
5

ho i seguenti stati visivi definito:VisualStateManager non può generare transizioni per 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> 

La multa DoubleAnimation e ColorAnimation lavoro, con animazioni di transizione VisualStateManager generatrici oltre 2 secondi per loro.

Tuttavia, lo ThicknessAnimation non si anima. Invece si aggancia al valore finale alla fine del periodo di transizione.

C'è un modo per ottenere VisualStateManager per generare transizioni per esso, o sto per essere costretto a fornire le transizioni manuali?

+0

Ho notato lo stesso. Quando usi visivamente Blend per trascinare un bordo, funziona internamente usando RenderTransform. Modificare un margine a mano ha lo stesso effetto. Immagino sia un bug o una funzionalità non implementata .. – Wouter

risposta

2

ho analizzato il problema e sparato .NET Reflector e ha scoperto che il VisualStateManager supporta solo i seguenti animazioni:

  • ColorAnimation
  • DoubleAnimation
  • PointAnimation

È una specie di schifoso, perché non è documentato da nessuna parte.

Per dimostrare che non è possibile generare le animazioni, dare un'occhiata al codice invertito del metodo VisualStageManager.GenerateToAnimation. C'è anche un VisualStageManager.GenerateFromAnimation che supporta lo stesso sottoinsieme di animazioni.

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

Bottomline ... Puoi usare solo colori, animazioni doppie o punto nella VisualStageManager. Ripristina trigger precedenti se hai bisogno di qualcos'altro ...

+0

Fastidioso ma utile! Saluti. – GazTheDestroyer

0

Forse l'istruzione ThicknessAnimation non è completa, cerco l'esempio di codice scorrevole da MSDN nell'argomento "Classe SpessoreAnimazione".

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

Spero che questo potrebbe aiutare ...

+0

Grazie, ma sfortunatamente questa è un'animazione. I VisualState richiedono gli storyboard statici poiché impostano stati noti. Potrei definire il precedente come una transizione, ma questo è quello che sto cercando di evitare. – GazTheDestroyer

+0

OK, ora è chiaro per me –