エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

FrameworkElement.LayoutUpdated イベント

2013/12/12

Windows Phone のビジュアル ツリーのレイアウトが変化したときに発生します。

Namespace:  System.Windows
アセンブリ:  System.Windows (System.Windows.dll 内)
XAML の XMLNS: xmlns にマップされていません。

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

LayoutUpdated は、コントロールで対話の準備ができる前のシーケンスで最後に発生する "オブジェクト有効期間" イベントです。ただし、さまざまな理由により、オブジェクトの有効期間中の実行時に LayoutUpdated も発生する場合があります。たとえば、プロパティの変更、ウィンドウのサイズ変更、明示的な要求 (UpdateLayout または ApplyTemplate) などによって発生します。LayoutUpdated イベントは、ツリー内で発生する可能性のある SizeChanged イベントがすべて発生した後に発生します。

Windows Phone では、このイベントはルーティング イベントではありません。RoutedEventArgs ではなく EventArgs を使用する標準の CLR イベントです。

LayoutUpdated は、ハンドラーがアタッチされているオブジェクトによって、その下のビジュアル ツリーが変更されているとは限らない場合にも発生する場合があります。たとえば、2 つの要素を持つレイアウト コンテナーを考えます。最初のオブジェクトでプロパティが変更され、その結果として新しいレイアウトが生成された場合は、両方のオブジェクトで LayoutUpdated が発生します。これは、2 番目のオブジェクト自体に従属するレイアウトが変更されていなくても、そのオブジェクトの位置が変わる可能性があるためです。

LayoutUpdated を処理する際、sender の値に依存することは避けてください。LayoutUpdatedsender は、ハンドラーがどこにアタッチされているかに関係なく、常に null です。これには、ハンドラーによって sender に何らかの情報が割り当てられる (ビジュアル ツリー内の特定の要素によってイベントが発生したことを暗に示すなど) ことを避けるねらいがあります。実際は、LayoutUpdated が意味するのは、Windows Phone のビジュアル ツリー全体における変化です。このツリー内のどこかに存在するオブジェクトであれば、どのオブジェクトでも、必要に応じて、このイベントを処理することができます。

イベントの順序付けは、Windows Phone OS 7.1 と Windows Phone 8 で厳密に同じではありません。このため、LayoutUpdated イベントが Windows Phone 8 で初めて発生したときに、この最初のイベントは、正しい寸法を持ちません。2 回目に発生したとき、寸法は正確になります。

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

表示:
© 2014 Microsoft