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