如何判断特定故事板当前是否在元素上处于活动状态?

时间:2013-09-25 06:33:00

标签: wpf storyboard

我们有一个故事板,用于表示已在TextBox中输入有效值。具体来说,它将背景设置为绿色,然后将其淡化为浅绿色,然后保持在那里。如果该值未通过,则我们删除故事板

这是我们在文本更改时运行的伪代码...

if(testPassed)
    PassedAnimationWithHold.Begin(TestTextBox, true);
else // <-- We need a condition here to determine if we actually should remove it or not
    PassedAnimationWithHold.Remove(TestTextBox);

问题是如果他们从头开始输入无效字符,上面的代码会尝试删除尚未应用的故事板。

如果没有添加我们自己的布尔标志,是否有一种方法可以测试该故事板是否在我们的元素上处于活动状态?

更新

@ sa_ddam213下面的答案似乎正朝着正确的方向发展,但正如我在评论中所说的,这取决于故事板的最终目标(以及动画属性)的知识。

例如,考虑我们的实际故事板,当应用于控件时,将其背景光脉冲为绿色,然后淡化为预先设置的动画背景颜色(注意:据了解,我们仅将其应用于指定了SolidColorBrush用于它们的背景,否则这当然会失败,因为并非所有画笔都具有'Color'属性。)

<Storyboard x:Key="{x:Static gr:Storyboards.PassedPulseKey}"
    Storyboard.TargetProperty="Background.Color">

    <ColorAnimation
        From="#F8F8"
        Duration="{StaticResource {x:Static gr:Storyboards.PulseDurationKey}}"
        FillBehavior="Stop" />

</Storyboard>

因此,为了使用他的技术,我们需要能够在存储在storyboard-applied-to-object的Background属性中的SolidColorBrush上的Color属性的ValueSource上检查IsAnimated。那就是我撞到另一堵墙的地方。

如果我使用带触发器的样式来应用故事板而不是通过代码,我开始认为它更好,然后让WPF系统处理它。这意味着我必须向ViewModel添加一个'Passed'属性来绑定触发器。不过,它可以做到!

1 个答案:

答案 0 :(得分:2)

不确定是否可以使用您的代码,但在DependencyPropertyHelper中有一个GetValueSource方法会返回DependencyProperty的当前值,您可以检查它当前是否正在动画。

//
// Summary:
//     Gets a value that declares whether the property is being animated.
//
// Returns:
//     true if the property is animated; otherwise, false.
public bool IsAnimated { get; }

因此,如果您的TextBox在动态漫画中为其BorderBrush制作动画,则可以使用:

if (DependencyPropertyHelper.GetValueSource(TestTextBox, TextBox.BorderBrushProperty).IsAnimated)
{
   // stop storyboard
}