VisualStateManager无法为ThicknessAnimations生成过渡

Gaz*_*yer 5 wpf animation xaml visualstatemanager

我定义了以下视觉状态:

<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>
Run Code Online (Sandbox Code Playgroud)

DoubleAnimationColorAnimation做工精细,有VisualStateManager超过2秒对他们产生过渡动画.

但是,ThicknessAnimation没有动画.相反,它会在过渡期结束时捕捉到结束值.

有没有办法VisualStateManager为它生成转换,或者我将被迫提供手动转换?

Ram*_*ein 3

我分析了问题并启动了.NET Reflector,发现它只VisualStateManager支持以下动画:

  • 彩色动画
  • 双动画
  • 点动画

这有点蹩脚,因为它没有在任何地方记录。

为了证明它无法生成动画,请查看该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;
}
Run Code Online (Sandbox Code Playgroud)

底线... 您只能在 VisualStageManager 中使用彩色、双精度或点动画。如果您需要其他东西,请恢复到老式触发器......