このトピックはまだ評価されていません - このトピックを評価する

FrameworkElement.ArrangeOverride メソッド

2013/12/12

Windows Phone レイアウトの配置パスの動作を提供します。クラスはこのメソッドをオーバーライドして、独自の配置パス動作を定義できます。

Namespace:  System.Windows
アセンブリ:  System.Windows (System.Windows.dll 内)
protected virtual Size ArrangeOverride(
	Size finalSize
)

パラメーター

finalSize
型: System.Windows.Size
このオブジェクトがオブジェクト自体と子を配置するために使用する親の末尾の領域。

戻り値

型: System.Windows.Size
要素がレイアウトに配置された後に使用される実際のサイズ。

このメソッドには、ほとんどの Windows Phone FrameworkElement 派生クラスの組み込みレイアウトを実行する既定の実装があります。

内部のレイアウト ロジックまたはアプリケーション コードによってそのメソッドが呼び出されるたびに、ArrangeOverride が効果的に、Arrange の追加実装を提供します。配付可能なコンテンツ コントロールを作成する場合は、ArrangeOverride ロジックによって、コントロールの特定の配置パスのレイアウト ロジックが定義されます。

継承時の注意

Windows Phone の場合、レイアウトで要素のサイズと位置を決定する手法は、次の 2 つの手順に分けられます: 測定パスと配置パス。この手法の詳細については、「Windows Phone のレイアウト」を参照してください。

レイアウト処理の配置パスをカスタマイズするコントロール作成者 (またはパネル作成者) は、ArrangeOverride をオーバーライドする必要があります。実装パターンでは、表示可能な各子オブジェクトの Arrange を呼び出して、各子オブジェクトの最終的な必要サイズを finalRect パラメーターとして渡します。表示される子オブジェクトを含むコンテナーでは、各子オブジェクトの Arrange を呼び出す必要があります。呼び出さない場合は、子オブジェクトが描画されません。

複数の既存の非シール Windows Phone クラスは、このメソッドのオーバーライド実装を提供します。次がその代表的な例です。StackPanel.ArrangeOverride および Grid.ArrangeOverride

通常、ArrangeOverride の動作によって、レイアウト コンテナー自体に割り当てられたユーザー定義の値に違反しない finalSize が生成されます。たとえば、finalSize は通常、コンテナーの Height および Width より大きくなることはありません。これは、コンテンツ領域に影響する Margin または Padding 値が考慮されるためです。特にコンテナーのサイズを超えた場合のシナリオを持つコントロールでは、より大きな値を返すことができますが、それにより生じるクリッピングと配置の問題を考慮する必要があります。

一般に、ArrangeOverride の実装で、各子オブジェクトに対して Arrange に渡される値は、そのオブジェクトに対する前の測定パスで DesiredSize に設定された値です。ただし、コンテナーによって有効になる特定のレイアウト機能によっては、値が異なる場合もあります。

次の例では、カスタム パネル実装の配置パス ロジックをカスタマイズするために ArrangeOverride を実装しています。特に、コードに関して次の点に注意してください。

  • 子を反復処理します。

  • それぞれの子に対して、Rect を使用して Arrange を呼び出します。ここで、Height および WidthDesiredSize に基づき、X および Y はパネルに固有のロジックに基づきます。

  • サイズを返します (この例の場合、この単純なパネルは、配置された Rect 測定値を累積して計算されたサイズではなく、固定サイズを返します)。


// Second arrange all children and return final size of panel
protected override Size ArrangeOverride(Size finalSize)
{
    // Get the collection of children
    UIElementCollection mychildren = Children;

    // Get total number of children
    int count = mychildren.Count;

    // Arrange children
    // We're only allowing 9 children in this panel.  More children will get a 0x0 layout slot.
    int i;
    for (i = 0; i < 9; i++)
    {

        // Get (left, top) origin point for the element in the 3x3 block
        Point cellOrigin = GetOrigin(i, 3, new Size(100, 100));

        // Arrange child
        // Get desired height and width. This will not be larger than 100x100 as set in MeasureOverride.
        double dw = mychildren[i].DesiredSize.Width;
        double dh = mychildren[i].DesiredSize.Height;

        mychildren[i].Arrange(new Rect(cellOrigin.X, cellOrigin.Y, dw, dh));

    }

    // Give the remaining children a 0x0 layout slot
    for (i = 9; i < count; i++)
    {
        mychildren[i].Arrange(new Rect(0, 0, 0, 0));
    }


    // Return final size of the panel
    return new Size(300, 300);
}

// Calculate point origin of the Block you are in
protected Point GetOrigin(int blockNum, int blocksPerRow, Size itemSize)
{
    // Get row number (zero-based)
    int row = (int)Math.Floor(blockNum / blocksPerRow);

    // Get column number (zero-based)
    int column = blockNum - blocksPerRow * row;

    // Calculate origin
    Point origin = new Point(itemSize.Width * column, itemSize.Height * row);
    return origin;

}


Windows Phone OS

サポート: 8.0, 7.1, 7.0

この情報は役に立ちましたか。
(残り 1500 文字)
フィードバックをいただき、ありがとうございました
表示:
© 2014 Microsoft. All rights reserved.