2012-10-05 35 views
5

He los siguientes estados visuales definidos:VisualStateManager no puede generar transiciones para 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 y ColorAnimation trabajo, con animaciones de transición VisualStateManager generación de más de 2 segundos para ellos.

Sin embargo, el ThicknessAnimation no se anima. En cambio, se ajusta al valor de finalización al final del período de transición.

¿Hay alguna forma de obtener VisualStateManager para generar transiciones, o me veré obligado a proporcionar transiciones manuales?

+0

Noté lo mismo. Cuando utilizas Blend visualmente para arrastrar un borde, funciona internamente usando RenderTransform. Modificar un margen a mano tiene el mismo efecto. Supongo que es un error o una característica no implementada. – Wouter

Respuesta

2

que analiza el problema y encendió .NET Reflector y encontró que la VisualStateManager sólo es compatible con las siguientes animaciones:

  • ColorAnimation
  • DoubleAnimation
  • PointAnimation

Es un poco asqueroso, porque no está documentado en ninguna parte.

Para demostrar que no puede generar las animaciones, eche un vistazo al código invertido del método VisualStageManager.GenerateToAnimation. También hay un VisualStageManager.GenerateFromAnimation que admite el mismo subconjunto de animaciones.

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

Línea inferior ... Solo puede usar animaciones de Color, Doble o Punto en el VisualStageManager. Vuelva a los desencadenantes pasados ​​de moda si necesita algo más ...

+0

Molesto pero útil! Aclamaciones. – GazTheDestroyer

0

Tal vez su declaración ThicknessAnimation no es completa, busco la muestra del código que fluye de MSDN en el tema "Clase de animación de espesor".

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

Hope esto podría ayudarle ...

+0

Gracias, pero desafortunadamente esta es una animación. VisualStates requiere guiones gráficos estáticos ya que establecen estados conocidos. Podría definir lo anterior como una transición, pero esto es lo que trato de evitar. – GazTheDestroyer

+0

OK, está claro para mí ahora –

Cuestiones relacionadas