簡體   English   中英

如何使動畫可以期待?

[英]How to make animation awaitable?

很抱歉無法提供更准確的標題,但這是我想做的。 我有一個方法foo ,它將啟動一些UI動畫。 這些動畫完成后,我要表示方法已完成。 但是,我不想讓事件通過信號通知完成,而是希望該方法可以awaitable 如何才能做到這一點?

void foo()
{  
  // start some animations 
   storyboard.Begin();
   storyboard.Completed += (s, e) => { // signal that foo has completed }
}

調用代碼應該能夠編寫:

await foo();

我的實際foo比上面的插圖更復雜,因為我有一系列動畫,它們接連發生,並且foo應該在所有動畫完成后完成。

通常,通過使用TaskCompletionSource來“包裝”基於事件完成的事情。 不幸的是, MSDN上的示例 (IMHO)過於復雜,而不僅僅是一個實例+事件。 您會有類似的內容:

public Task Foo()
{
    var tcs = new TaskCompletionSource<bool>();
    storyboard.Begin();
    storyboard.Completed += (s, e) => tcs.SetResult(true);
    return tcs.Task;
}

在這種情況下,沒有真正的TResult需求,但是TaskCompletionSource似乎沒有非通用版本,並且我不確定等效的模式是什么

我最近遇到了這樣一種情況,即使我在調用Begin()之前設置了事件處理程序,也沒有按時觸發Completed事件,有時甚至根本不觸發(這是我發現的大多數其他相關帖子的罪魁禍首) 。 因此,我一直在尋找一種方法來等待動畫結束,然后繼續使用相同的方法。 我最終創建了以下靜態方法,該方法將要等待的情節提要作為參數。

public async static Task RunStoryboard(Storyboard Story)
{
    Story.Begin();
    while (Story.GetCurrentState() == ClockState.Active && Story.GetCurrentTime() < Story.Duration)
    {
        await Task.Delay(100);
    }
}

我添加第二個條件是因為,在從未觸發Completed事件的那些情況下,即使動畫結束后,ClockState也會始終顯示為活動狀態。 因此,這需要明確設置情節提要的持續時間,但到目前為止,它對我來說一直很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM