gpt4 book ai didi

WPF:在执行操作之前等待 Storyboard动画完成的正确方法是什么

转载 作者:行者123 更新时间:2023-12-02 07:43:40 28 4
gpt4 key购买 nike

我有一个 Storyboard,我重复使用它来制作一些图片的动画,我想在每个动画之后执行一些操作,其中包括一些计算,然后运行另一个动画,所以我相信我应该使用 Storyboard的完成事件MyStoryboard .Completed +=storyboard_Completed;

我好奇的是,我应该在当前 StoryBoard 的 Storyboard_Completed Event 中开始下一个动画吗?而且,如果我使用 Application.Current.Dispatcher 对象在单独的线程中启动第一个动画,是否会产生任何影响?

如果我使用 Application.Current.Dispatcher 在单独的线程中调用 StoryBoard.Begin(),是否也会在 UI 线程中调用 Storyboard_Completed 事件?在这种情况下,我是否仍然需要将下一个动画包装在另一个调度程序调用中?

private void Story_Completed(object sender, EventArgs e)
{
Application.Current.Dispatcher.Invoke((Action)delegate()
{
SomeNewStoryBoardAnimation.Begin();
}
}

这是正确的吗?或者是否有更好的方法来检查 Storyboard是否已结束并在之后立即开始下一组计算和 Storyboard动画?

我想过使用单个后台工作人员按顺序处理所有动画和计算,但我也想知道如何“等待”动画完成,然后再开始下一组计算和动画。 BackGroundWorker 在等待动画完成时 Thread.sleep 正常吗?

最佳答案

您可以将 Storyboard 包装在 Task 中对象和 await其完成。

这里有一段出色的示例代码,说明了如何做到这一点,取自 blog post作者:莫滕·尼尔森:

public static class StoryboardExtensions
{
public static Task BeginAsync(this Storyboard storyboard)
{
System.Threading.Tasks.TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
if (storyboard == null)
tcs.SetException(new ArgumentNullException());
else
{
EventHandler<object> onComplete = null;
onComplete = (s, e) => {
storyboard.Completed -= onComplete;
tcs.SetResult(true);
};
storyboard.Completed += onComplete;
storyboard.Begin();
}
return tcs.Task;
}
}

本质上,您正在创建一个扩展方法,该方法返回一个 Task 对象,表示 Storyboard 已完成。通过这种方式,您可以获得一些不错的流畅语法,如下所示:

//Start the storyboard and asynchronously await completion...
await myStoryboard.BeginAsync();

//Do my other stuff here, after the storyboard completes...

关于WPF:在执行操作之前等待 Storyboard动画完成的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14690960/

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