FrameworkElement.LayoutUpdated 事件

2013/12/13

当 Windows Phone 可视化树的布局更改时发生。

Namespace:  System.Windows
程序集:  System.Windows(位于 System.Windows.dll 中)
XMLNS for XAML: 未映射到 xmlns。

public event EventHandler LayoutUpdated
<frameworkElement LayoutUpdated="eventhandler"/>

LayoutUpdated 是序列中准备好进行交互的控件之前要发生的最后一个对象生存期事件。 但是,由于以下多种原因,在对象生存期期间也可能在运行时发生 LayoutUpdated: 属性更改、窗口大小调整或显式请求(UpdateLayoutApplyTemplate)。 在树中的所有可能 SizeChanged 事件引发完成后,引发 LayoutUpdated 事件。

在 Windows Phone 中,此事件不是路由事件,而是使用 EventArgs(而非 RoutedEventArgs)的标准 CLR 事件。

当附加处理程序的对象不必更改其下的可视化树中的任何内容时,可能发生 LayoutUpdated。 例如,假设一个包含两个元素的布局容器。 如果第一个对象更改了一个强制执行新布局的属性,两个对象都会引发 LayoutUpdated,因为第二个对象可能会被重新定位,即使其自己的子布局不发生更改也是如此。

当您处理 LayoutUpdated 时,不要依赖于 sender 值。 对于 LayoutUpdatedsender 始终为 null,而无论在何处附加处理程序。 这是为了防止处理程序将任何含义分配给 sender,例如,暗示正是由特定元素在可视化树之外引发了此事件。 相反,LayoutUpdated 暗示总体 Windows Phone 可视化树中的某些内容已发生变化,树中任何位置的每个特定对象都具有处理此事件的选项。

Windows Phone OS 7.1 和 Windows Phone 8 之间的事件排序不完全相同。 因此,初始 LayoutUpdated 事件第一次在 Windows Phone 8 上面发生时范围不正确。 第二次发生时其范围正确。

如果您使用 LayoutUpdated 中的范围,您可以首先检查 ActualWidthActualHeight 是否大于 0 和有效来逐步缩小该差异。 下面的代码示例演示如何处理该差异和它对 Windows Phone OS 7.1 及 Windows Phone 8 产生的影响。

double currentUIERWidth = 0, currentUIERHeight = 0;

void MainPage_LayoutUpdated(object sender, EventArgs e)
{
    if (LayoutRoot.ActualWidth > 0 && LayoutRoot.ActualHeight > 0 &&
      (LayoutRoot.ActualWidth != currentUIERWidth ||
      LayoutRoot.ActualHeight != currentUIERHeight))
    {
        uiRenderer = new UIElementRenderer(LayoutRoot, (int)LayoutRoot.ActualWidth, (int)LayoutRoot.ActualHeight);
        currentUIERWidth = LayoutRoot.ActualWidth;
        currentUIERHeight = LayoutRoot.ActualHeight;
    }
}

Windows Phone OS

受以下版本支持: 8.0, 7.1, 7.0

Windows Phone

显示:
© 2014 Microsoft