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

标签 wpf wpf-controls

我有一个 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/

相关文章:

wpf - ColumnDefinition 在调整大小之前不会扩展

WPF:如何为自定义用户控件创建事件?

c# - 破译触发事件的控件

WPF 类组合框自定义控件

c# - 将 ObservableCollection 绑定(bind)为不同 CollectionViewSource 的源

c# - 带有空数据表的 DataGrid 允许用户输入 C# WPF

wpf - RichTextBox 中字符输入太慢,如何让输入更快?

c# - 如何让文本适合 WPF 中的文本 block

c# - 异步添加到 ObservableCollection(或替代方案)

wpf - 直接在 WPF 中绘制快速图形,而不是使用 CompositionTarget.Rendering