【问题标题】:Waiting for XAML layout to complete等待 XAML 布局完成
【发布时间】:2013-01-01 14:45:00
【问题描述】:

我正在对页面进行一些更改(通过添加/删除控件),并且我希望仅在布局确定后(测量和排列所有元素等)后继续使用我的代码。

我该怎么做?是否有一些我可以等待的任务会在布局完成时触发?

(现在正在使用 Yields 和其他技巧,但它们都让我感到肮脏)

【问题讨论】:

标签: wpf xaml asynchronous windows-8


【解决方案1】:

您可以使用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 似乎还不够——它可以触发多次。但是谢谢。
  • 仅供参考,我为a UWP question 提出了一个几乎相同的解决方案,但在那种情况下,仅仅等待事件是行不通的;我不得不强制注入一个虚拟等待以允许 UI 线程泵送。
猜你喜欢
  • 2020-05-22
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-04
  • 2019-04-03
  • 2020-07-04
  • 2011-12-28
  • 2011-09-08
相关资源
最近更新 更多