UIElement.Arrange(Rect) メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
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)
パラメーター
例
この例では、 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 を呼び出すのが最適なオプションである、より複雑なシナリオにレイアウト状況が存在する可能性があります。 慎重かつ控えめに使用してください。