2013-01-01 138 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线程抽取。 –