UIElement.Arrange(Rect) メソッド

定義

子オブジェクトを配置し、 UIElement のサイズを決定します。 子要素のカスタム レイアウトを実装する親オブジェクトは、レイアウトオーバーライド実装からこのメソッドを呼び出して、再帰的なレイアウト更新を形成する必要があります。

public:
 virtual void Arrange(Rect finalRect) = Arrange;
void Arrange(Rect const& finalRect);
public void Arrange(Rect finalRect);
function arrange(finalRect)
Public Sub Arrange (finalRect As Rect)

パラメーター

finalRect
Rect

親がレイアウト内の子に対して計算する最終的なサイズ 。 Rect 値として指定されます。

この例では、 ArrangeOverride 実装内で Arrange を使用する方法を示します。 基本的な考え方は、FinalRectとして渡す前に目的のサイズを変更または無視する特定のデザインがない限り、FinalRect の値を持つよう、Arrange を呼び出そうとするものに対して DesiredSize に対してクエリを実行する必要があるということです。

// 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);
}
'Second arrange all children and return final size of panel 
Protected Overrides Function ArrangeOverride(ByVal finalSize As Size) As Size
    'Get the collection of children 
    Dim mychildren As UIElementCollection = Children
    'Get total number of children 
    Dim count As Integer = mychildren.Count
    'Arrange children 
    'only allowing 9 children in this panel. More children will get a 0x0 layout slot. 
    Dim i As Integer
    For i = 0 To 8
        'Get (left, top) origin point for the element in the 3x3 block 
        Dim cellOrigin As Point = 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. 
        Dim dw As Double = mychildren(i).DesiredSize.Width
        Dim dh As Double = mychildren(i).DesiredSize.Height
        mychildren(i).Arrange(New Rect(cellOrigin.X, cellOrigin.Y, dw, dh))
    Next
    For i = 9 To count - 1
        'Give the remaining children a 0x0 layout slot 
        mychildren(i).Arrange(New Rect(0, 0, 0, 0))
    Next
    'Return final size of the panel 
    Return New Size(300, 300)
End Function
'Calculate point origin of the Block you are in 
Protected Function GetOrigin(ByVal blockNum As Integer, ByVal blocksPerRow As Integer, ByVal itemSize As Size) As Point
    'Get row number (zero-based) 
    Dim row As Integer = CInt(Math.Floor(blockNum / blocksPerRow))
    'Get column number (zero-based) 
    Dim column As Integer = blockNum - blocksPerRow * row
    'Calculate origin 
    Dim origin As New Point(itemSize.Width * column, itemSize.Height * row)
    Return origin
End Function

注釈

Arrange 呼び出しは、その特定のクラスの ArrangeOverride 実装に到達する可能性があります。 それ以外の場合、ほとんどの FrameworkElement クラスには、Arrange の暗黙的な既定のレイアウト動作があります。

XAML UI での初期レイアウト配置の計算は、 Measure 呼び出しと Arrange 呼び出しで構成されます。 Measure 呼び出し中に、レイアウト システムは availableSize 測定を使用して要素のサイズ要件を決定します。 配置呼び出し中に、レイアウト システムは要素の境界ボックスのサイズと位置を最終処理します。

レイアウトが最初に生成されると、配置の前に 常に Measure 呼び出しが行われます。 ただし、最初のレイアウト パスの後に、配置呼び出しは 、前に Measure を指定せずに行うことができます。 これは、配置のみに影響するプロパティが変更された場合 (配置など)、または親が Measure を使用せずに配置を受け取る場合に発生する可能性があります。

Measure 呼び出しでは、すべての Arrange 情報が自動的に無効になります。 通常、レイアウトの更新は非同期的に行われます (レイアウト システムによって決定されます)。 要素のサイズ変更 ( Width など) に影響を与えるプロパティに対する変更が、要素にすぐに反映されない場合があります。

UpdateLayout メソッドを使用して、組み込みのレイアウト システムの動作に依存するのではなく、アプリ コードによってレイアウトの更新を強制できます。 ただし、これはお勧めしません。 通常は不要であり、過度に使用するとパフォーマンスが低下する可能性があります。 プロパティの変更により、アプリ コードから UpdateLayout を 呼び出すのが適切な多くの状況では、レイアウト システムが既に更新プログラムを処理している可能性があります。 レイアウト システムには、親子関係を介したレイアウト変更の連鎖を処理するための最適化もあります。 UpdateLayout を呼び出すと、このような最適化に対して機能します。 ただし、レイアウトの問題やレイアウトに関するその他の問題を解決するために UpdateLayout を呼び出すのが最適なオプションである、より複雑なシナリオにレイアウト状況が存在する可能性があります。 慎重かつ控えめに使用してください。

適用対象

こちらもご覧ください