[英]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.