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)
参数
示例
此示例演示如何 Arrange
在 ArrangeOverride 实现中使用 。 基本思路是,应查询尝试调用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);
}
注解
调用 Arrange
可能会到达该特定类的 ArrangeOverride 实现。 否则,大多数 FrameworkElement 类具有 的 Arrange
隐式默认布局行为。
XAML UI 中初始布局定位的计算包括 一个 Measure 调用和一个 Arrange
调用(按该顺序排列)。 在 Measure
调用期间,布局系统使用 availableSize
度量来确定元素的大小要求。 在 Arrange 调用期间,布局系统将确定元素边界框的大小和位置。
首次生成布局时,它始终具有在 之前Arrange
发生的 Measure 调用。 但是,在第一个 Arrange
布局通过后,调用可能会发生,而没有 Measure
之前。 当仅Arrange
影响 的属性 (更改(例如对齐) )时,或者父级在没有 的情况下Measure
收到 Arrange
时,可能会发生这种情况。
Measure 调用将自动使任何Arrange
信息失效。 布局更新通常在布局系统) 确定的时间异步 (发生。 元素可能不会立即反映影响元素大小调整 (的属性更改,例如 Width) 。
布局更新可以由应用代码强制执行,而不是依赖于使用 UpdateLayout 方法的内置布局系统行为。 但是,不建议这样做。 这通常是不必要的,如果过度使用,可能会导致性能不佳。 在许多情况下,由于属性更改,从应用代码调用 UpdateLayout
可能是合适的,布局系统可能已经在处理更新。 布局系统还进行了优化,用于通过父子关系处理布局更改的级联,并且调用 UpdateLayout
可以针对此类优化。 不过,布局情况可能存在于更复杂的方案中,其中调用 UpdateLayout
是解决计时问题或其他布局问题的最佳选择。 只是故意和谨慎地使用它。