gpt4 book ai didi

c# - WPF 中的同步/阻塞动画?

转载 作者:行者123 更新时间:2023-11-30 22:44:28 28 4
gpt4 key购买 nike

我迫切需要 C#/WPF 中的同步/阻塞动画(不幸的是,在我的情况下,在完成的事件中执行代码是不够的)。

我尝试了两种方式:

1) 使用持续时间为 x 的 BeginAnimation 启动(异步)动画。在异步调用后添加 Thread.Sleep(x)。但这不起作用,动画在线程休眠给定持续时间后启动。

2) 使用信号(AutoResetEvent 类):在另一个线程中启动动画,动画完成事件信号表明动画已使用信号完成。结果:代码永远不会执行,整个线程被阻塞,没有动画显示/启动,尽管锁定的代码在 BeginAnimation 调用之后启动。也许我以错误的方式使用信号? (我以前从未使用过它们)。(基于此线程的想法:WPF: Returning a method AFTER an animation has completed)

您可以在 http://cid-0432ee4cfe9c26a0.office.live.com/self.aspx/%C3%96ffentlich/BlockingAnimation.zip 找到示例项目

非常感谢您的帮助!

顺便说一句,这是纯代码:

方法一:

messageLogTB.Clear();

TranslateTransform translateTransform = new TranslateTransform();
animatedButton.RenderTransform = translateTransform;

DoubleAnimation animation = new DoubleAnimation(0, 200.0, new Duration(TimeSpan.FromMilliseconds(2000)));
translateTransform.BeginAnimation(TranslateTransform.XProperty, animation);

// Animation is asynchronous and takes 2 seconds, so lets wait two seconds here
// (doesn't work, animation is started AFTER the 2 seconds!)
Thread.Sleep(2000);
messageLogTB.Text += "animation complete";

方法二:

messageLogTB.Clear();

TranslateTransform translateTransform = new TranslateTransform();
animatedButton.RenderTransform = translateTransform;

AutoResetEvent trigger = new AutoResetEvent(false);

// Create the animation, sets the signaled state in its animation completed event
DoubleAnimation animation = new DoubleAnimation(0, 200.0, new Duration(TimeSpan.FromMilliseconds(2000)));
animation.Completed += delegate(object source, EventArgs args)
{
trigger.Set();
messageLogTB.Text += "\nsignaled / animation complete";
};


// Start the animation on the dispatcher
messageLogTB.Text += "starting animation";

Dispatcher.Invoke(
new Action(
delegate()
{
translateTransform.BeginAnimation(TranslateTransform.XProperty, animation);
}
), null);

// Wait for the animation to complete (actually it hangs before even starting the animation...)
trigger.WaitOne();
messageLogTB.Text += "\nThis should be reached after the signal / animation";

最佳答案

不要让线程变得复杂。使用 Animation 的 Completed 事件代替在单个序列中链接多个动画或在 Completed 事件中执行一些代码。

关于c# - WPF 中的同步/阻塞动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3420901/

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