WPF动画重复时如何触发事件处理程序

时间:2010-04-19 13:44:49

标签: wpf animation repeat

我有一个将RepeatBehavior设置为Forever的WPF动画。每次重复动画时都需要更新某些内容。我无法弄清楚如何捕获重复事件,Complete事件处理程序不适用于此。动画间隔是可编程的,并由一些环境因素决定。所以使用计时器不是一个简洁的方法。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

不要使用Forever的RepeatBehavior,只需运行一次,然后捕获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);
}

请注意,尽管已在动画中声明,但已完成事件位于故事板上。如果您在其他一些动画中将RepeatForever设置为true,则永远不会触发该事件。

答案 1 :(得分: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;
    }
}