gpt4 book ai didi

WPF Storyboard 事件未触发

转载 作者:行者123 更新时间:2023-12-04 14:33:41 26 4
gpt4 key购买 nike

我有一个简单的 Storyboard ,可以重复和自动反转。当它到达终点并自动反转时,我想在后面的代码中触发一个事件。重复时也一样。我怎样才能做到这一点?最终我在这两个事件中播放了一个 wav 文件。谢谢。

最佳答案

WPF 动画由 AnimationClock(有点像花哨的计时器)控制。 AnimationClock 有一个名为 CurrentProgress 的属性,范围从 0 到 1;其中 0 是起点,1 是终点。一个重复的 Storyboard将逐渐改变 CurrentProgress 从 0 到 1 到 0 到 1...

当 AnimationClock 指示 Animation 渲染其下一帧时,Animation 引发其 CurrentTimeInvalidated 事件。此事件的发送者参数是 AnimationClock。此时您可以查看 CurrentProgress。但是,由于此事件仅在绘制新帧时触发,因此 CurrentProgress 可能永远不会恰好为 0 或恰好 1。相反,您需要寻找趋势。当您看到趋势发生变化时,这意味着循环已经开始或已经逆转。

示例 xaml:

<Grid x:Name="uxGrid" Background="White">
<Grid.Triggers>
<EventTrigger RoutedEvent="Grid.Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetName="uxGrid" Changed="ColorAnimation_Changed" CurrentTimeInvalidated="ColorAnimation_CurrentTimeInvalidated" Storyboard.TargetProperty="Background.Color" From="Blue" To="Green" Duration="0:0:5" AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Grid.Triggers>
</Grid>

示例代码:

private double? _clockLastProgress;  // Tracks Trend
private bool _clockLastDecreased; // Tracks Trend Direction

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

if (clock != null && clock.CurrentProgress.HasValue)
{
if (!_clockLastProgress.HasValue)
{
// Your Code Here
}
else
{
if (_clockLastDecreased)
{
if (clock.CurrentProgress > _clockLastProgress)
{
// Your Code Here
_clockLastDecreased = false;
}
}
else
{
if (clock.CurrentProgress < _clockLastProgress)
{
// Your Code Here
_clockLastDecreased = true;
}
}
}

_clockLastProgress = clock.CurrentProgress.Value;
}
}

关于WPF Storyboard 事件未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5914706/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com