【问题标题】:How can you tell if a specific storyboard is currently active on an element?您如何判断特定情节提要当前是否在元素上处于活动状态?
【发布时间】:2013-09-26 03:49:41
【问题描述】:

我们有一个故事板,我们用它来指示一个有效值已输入到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 在下面的回答似乎朝着正确的方向前进,但正如我在 cmets 中所说的那样,这取决于故事板的最终目标(之一)以及动画属性的知识.

例如,考虑我们实际的故事板,当应用于控件时,它的背景会发出淡绿色脉冲,然后淡出动画前的背景颜色(注意:据了解,我们仅将其应用于指定了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>

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

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

【问题讨论】:

    标签: wpf storyboard


    【解决方案1】:

    不确定是否可以使用您的代码,但在 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
    }
    

    【讨论】:

    • 这很接近,但它需要了解正在动画的 DependencyProperty,这是 Storyboard 内部的。 Storyboard 公开了一个 GetTargetProperty,但它返回一个 PropertyPath,它是相对于目标对象的,因此,我不知道有什么方法可以从目标对象和路径中获取属性。不过,为您帖子中的信息 +1 尽管我无法在没有缺失信息的情况下给出答案。
    • 顺便说一句,我用更多细节更新了这个问题,包括我们实际的故事板。我开始认为如果我使用带有触发器的样式而不是通过代码来应用故事板,那么它会更好,然后让 WPF 系统来处理它。
    • 对我不起作用。我没有使用 Storyboard 本身,而是我的装饰者的 BeginAnimation()-method。它的动画效果非常好,但您的解决方案总是返回 true。如果有动画在atm运行,有什么方法可以实际获得?
    猜你喜欢
    • 2017-06-30
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2021-11-08
    • 2012-02-09
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多