0

我们有一个故事板,我们用它来指示一个有效值已被输入到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 的对象背景,否则这当然会失败,因为并非所有画笔都具有“颜色”属性。)

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

因此,为了使用他的技术,我们需要能够检查存储在故事板应用对象的背景属性中的 SolidColorBrush 的 Color 属性的 ValueSource 上的 IsAnimated。那是我撞到另一面墙的地方。

我开始认为如果我使用带有触发器的样式而不是通过代码来应用情节提要,然后让 WPF 系统来处理它会更好。这意味着我必须向我们的 ViewModel 添加一个“已通过”属性才能将触发器绑定到。不过,还是可以的!

4

1 回答 1

2

不确定是否可以与您的代码一起使用,但是DependencyPropertyHelper有一个GetValueSource方法可以返回 a 的当前值,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; }

因此,如果您在 Storyboard 中TextBox对其进行动画BorderBrush处理,您可以使用:

if (DependencyPropertyHelper.GetValueSource(TestTextBox, TextBox.BorderBrushProperty).IsAnimated)
{
   // stop storyboard
}
于 2013-09-25T06:53:58.197 回答