我正在對頁面進行一些更改(通過添加/刪除控件),並且只有在佈局解決(所有元素測量和排列等)時我纔想繼續使用我的代碼。等待XAML佈局完成
我該怎麼做?是否有一些任務可以等待佈局完成時觸發?
(現在使用的收益率和其他技巧,但他們都讓我覺得髒)
我正在對頁面進行一些更改(通過添加/刪除控件),並且只有在佈局解決(所有元素測量和排列等)時我纔想繼續使用我的代碼。等待XAML佈局完成
我該怎麼做?是否有一些任務可以等待佈局完成時觸發?
(現在使用的收益率和其他技巧,但他們都讓我覺得髒)
您可以通過使用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();
LayoutUpdated似乎不夠 - 它可以多次觸發。但是,謝謝。 –
僅供參考我想出了一個幾乎相同的[UWP問題]解決方案(https://stackoverflow.com/questions/47776473/how-to-create-variable-number-of-richtextboxoverflow-elements/47803012#47803012)但在這種情況下,僅僅等待事件並不奏效;我不得不強制也注入一個虛擬等待來允許UI線程抽取。 –
這可能會有幫助:http://stackoverflow.com/a/3684356/276994 – Vlad