2012-10-05 208 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做工精细,用VisualStateManager生成过渡动画超过2秒他们。

但是,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; 
} 

Bottomline ...您只能在VisualStageManager中使用Color,Double或Point动画。如果你需要别的东西,还原为老式的触发器...

+0

烦人但有用!干杯。 – GazTheDestroyer

0

也许你的ThicknessAnimation语句没有完成,我从主题为“ThicknessAnimation Class”的MSDN中搜索流动的代码示例。

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

希望能帮助你...

+0

谢谢,但不幸的是,这是一个动画。 VisualState需要静态故事板,因为它们设置已知状态。我可以将上述定义为过渡,但这正是我试图避免的。 – GazTheDestroyer

+0

好吧,我现在很清楚 –