我正在对页面进行一些更改(通过添加/删除控件),并且只有在布局解决(所有元素测量和排列等)时我才想继续使用我的代码。等待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