当我指定默认持续时间时,VisualStateManager会混乱

时间:2012-10-05 09:33:22

标签: wpf xaml animation storyboard visualstatemanager

我正在尝试使用VisualStateManager来管理我的控件状态。以下工作正常,并给我一个状态之间的一秒动画。

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

        <!-- Default transition time commented out
        <VisualStateGroup.Transitions>
            <VisualTransition GeneratedDuration="0:0:2"></VisualTransition>
        </VisualStateGroup.Transitions>-->

        <VisualState Name="Normal">
            <Storyboard>
                <ThicknessAnimation Storyboard.TargetName="ViewBorder"
                    Storyboard.TargetProperty="Margin" To="0"/>
                <DoubleAnimation Storyboard.TargetName="HeaderTransform"
                    Storyboard.TargetProperty="ScaleY" To="0" />
            </Storyboard>
        </VisualState>

        <VisualState Name="Editing">
            <Storyboard>
                <ThicknessAnimation Storyboard.TargetName="ViewBorder"
                    Storyboard.TargetProperty="Margin" To="100,0,100,100"/>
                <DoubleAnimation Storyboard.TargetName="HeaderTransform"
                    Storyboard.TargetProperty="ScaleY" To="1" />
            </Storyboard>
        </VisualState>

    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

但是,如果我取消注释转换代码以尝试设置2秒的动画时间,那么它会非常混乱。

设置“编辑”时:

  • DoubleAnimation即时捕捉到1,没有动画。
  • ThicknessAnimation等待2秒,然后动画超过1 第二

设置“正常”时:

  • ThicknessAnimation即时捕捉到0,没有动画。
  • DoubleAnimation等待2秒,然后动画超过1秒。

任何人都可以解释发生了什么事吗?

我尝试在所有动画上设置Duration="0",就像某些样本似乎一样,但所有这一切都会删除有效的动画。我仍然得到2秒的延迟,然后拍摄而不是动画。

1 个答案:

答案 0 :(得分:0)

我已经发现足以知道这与GeneratedTransition没有任何关系。我只是不幸使用VisualStateManager不喜欢的两个动画。

首先,VisualStates 中的动画应具有Duration="0",因为这些是稳定状态。我正在移除它们,因为这是我在状态之间获得任何类型动画的唯一方式。然而,我实际看到的是在稳定状态期间的动画(即之后的转换,因此当我添加默认转换长度时引入暂停)。

我实现上述目标的唯一原因是添加了ColorAnimation,效果很好。

DoubleAnimation的{​​{1}}失败了,因为我的目标是变换本身。感谢this question,虽然原因不明,但我通过定位元素来实现它:

LayoutTransform.ScaleY

这只留下我的<DoubleAnimation Storyboard.TargetName="Header" To="0" Duration="0" Storyboard.TargetProperty="(FrameworkElement.LayoutTransform).(ScaleTransform.ScaleY)" /> ,它仍然只是捕捉到价值。我已经为此提出了another question,现在我把问题缩小了。