0

我有一个 WPF 动画,其中 RepeatBehavior 设置为 Forever。每次重复动画时都需要更新一些内容。我不知道如何捕获重复事件,Complete 事件处理程序不适用于此。动画间隔是可编程的,由一些环境因素决定。因此,使用计时器并不是一种巧妙的方法。我怎样才能做到这一点?

4

2 回答 2

0

与其拥有永远的重复行为,不如让它只运行一次,然后捕获 Completed 事件。进行处理,然后使用适当的 DependencyProperty 和动画调用 BeginAnimation。

例如,这是一个(诚然愚蠢的)示例来说明我的意思。

XAML:

<TextBlock x:Name="txtExample" 
           Text="Gradients Are Neat"
           FontSize="50">
    <TextBlock.Foreground>
        <LinearGradientBrush x:Name="rgbForeground">
            <LinearGradientBrush.GradientStops>

                <GradientStop x:Name="Color1" Color="#12BC23" Offset="0.0" />
                <GradientStop x:Name="Color2" Color="#AA0499" Offset="0.5" />
                <GradientStop x:Name="Color3" Color="#792BDF" Offset="1.0" />
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
    </TextBlock.Foreground>
    <TextBlock.Triggers>
        <EventTrigger RoutedEvent="TextBlock.Loaded">
            <EventTrigger.Actions>
                <BeginStoryboard>
                    <Storyboard x:Name="SomeStoryboard">
                        <ColorAnimation x:Name="changeColor1"
                                        Storyboard.TargetName="Color1"
                                        Storyboard.TargetProperty="Color"
                                        Duration="0:0:3"
                                        To="#81AD21"/>
                        <ColorAnimation x:Name="changeColor2"
                                        Storyboard.TargetName="Color2"
                                        Storyboard.TargetProperty="Color"
                                        Duration="0:0:2"
                                        To="#29910A"/>
                        <ColorAnimation x:Name="changeColor3"
                                        Storyboard.TargetName="Color3"
                                        Storyboard.TargetProperty="Color"
                                        Duration="0:0:5"
                                        To="#BB4923" 
                                        Completed="changeColor3JustOnce_Completed" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger.Actions>
        </EventTrigger>
    </TextBlock.Triggers>
</TextBlock>

代码背后:

private void changeColor3_Completed(object sender, EventArgs e)
{
    Color3.BeginAnimation(GradientStop.ColorProperty, changeColor3);
}

请注意,尽管在动画中声明了 Completed 事件,但它仍在 Storyboard 上。如果您在其他一些动画中将 RepeatForever 设置为 true,则永远不会触发该事件。

于 2010-04-19T19:58:30.447 回答
0

我找到了一个相当优雅的解决方案来解决这个问题。它只需要在元素上的CurrentTimeInvalidated事件中Timeline添加一个 EventHandler:

private TimeSpan _lastTime;

private void Animation_CurrentTimeInvalidated(object sender, EventArgs e)
{
    var clock = sender as AnimationClock;

    if (clock != null && clock.CurrentTime.HasValue)
    {
        if (clock.CurrentTime.Value < this._lastTime)
        {
            //TODO: Add any behavior to perform on a repeat here.
        }

        this._lastTime = clock.CurrentTime.Value;
    }
}
于 2011-01-24T17:55:16.403 回答