2013-01-01 135 views
1

我正在對頁面進行一些更改(通過添加/刪除控件),並且只有在佈局解決(所有元素測量和排列等)時我纔想繼續使用我的代碼。等待XAML佈局完成

我該怎麼做?是否有一些任務可以等待佈局完成時觸發?

(現在使用的收益率和其他技巧,但他們都讓我覺得髒)

+0

這可能會有幫助:http://stackoverflow.com/a/3684356/276994 – Vlad

回答

3

您可以通過使用TaskCompletionSource<T>圍繞打造任何事件Task

在你的情況,這聽起來像UIElement.LayoutUpdated可能是你想要的事件(不完全確定 - WPF佈局細節不是我的強項)。

下面是一個例子:

public static Task LayoutUpdatedAsync(this UIElement element) 
{ 
    var tcs = new TaskCompletionSource<object>(); 
    EventHandler handler = (s, e) => 
    { 
    element.LayoutUpdated -= handler; 
    tcs.SetCompleted(null); 
    }; 
    element.LayoutUpdated += handler; 
    return tcs.Task; 
} 

然後你就可以用這個方法來await該事件的下一個實例:

await myUiElement.LayoutUpdatedAsync(); 
+1

LayoutUpdated似乎不夠 - 它可以多次觸發。但是,謝謝。 –

+0

僅供參考我想出了一個幾乎相同的[UWP問題]解決方案(https://stackoverflow.com/questions/47776473/how-to-create-variable-number-of-richtextboxoverflow-elements/47803012#47803012)但在這種情況下,僅僅等待事件並不奏效;我不得不強制也注入一個虛擬等待來允許UI線程抽取。 –