0

RepeatBehavior を Forever に設定した WPF アニメーションがあります。アニメーションが繰り返されるたびに更新する必要があるものがあります。繰り返しイベントをキャッチする方法がわかりません。これには Complete イベント ハンドラーが機能しません。アニメーション間隔はプログラム可能で、いくつかの環境要因によって決定されます。したがって、タイマーを使用するのは適切な方法ではありません。どうやってやるの?

4

2 に答える 2

0

RepeatBehavior を Forever にする代わりに、1 回だけ実行して、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 イベントはストーリーボード上にあることに注意してください。他のいくつかのアニメーションで RepeatForever を true に設定した場合、イベントは発生しません。

于 2010-04-19T19:58:30.447 に答える
0

この問題に対するかなりエレガントな解決策を見つけました。要素のCurrentTimeInvalidatedイベントにEventHandler を追加するだけです。Timeline

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 に答える