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。 基本思路是,应查询要调用 Arrange 的任何内容 上的 DesiredSize ,以便具有 finalRect 的值,除非布局实现具有一些特定设计,在将其作为 finalRect 传递之前更改或忽略所需大小。
// 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 度量来确定元素的大小要求。 在 Arrange 调用期间,布局系统会确定元素边界框的大小和位置。
首次生成布局时,它始终具有在 Arrange 之前发生的 Measure 调用。 但是,在第一次布局传递后,在前面没有 Measure 的情况下,可能会发生 Arrange 调用。 当仅影响 Arrange 的属性 (更改(例如对齐) )或父级收到不含 Measure 的 Arrange 时,可能会发生这种情况。
Measure 调用将自动使任何排列信息失效。 布局更新通常在布局系统) 确定的时间异步 (发生。 元素可能不会立即反映影响元素大小调整 (的属性更改,例如 Width) 。
布局更新可由应用代码强制执行,而不是使用 UpdateLayout 方法依赖于内置布局系统行为。 但是,不建议这样做。 这通常是不必要的,如果过度使用,可能会导致性能不佳。 在许多情况下,由于属性更改,可能适合从应用代码调用 UpdateLayout ,布局系统可能已在处理更新。 布局系统还针对通过父子关系处理布局更改的级联进行了优化,并且调用 UpdateLayout 可以应对此类优化。 不过,布局情况可能存在于更复杂的方案中,调用 UpdateLayout 是解决计时问题或其他布局问题的最佳选择。 只是故意和谨慎地使用它。