FrameworkElement.ArrangeOverride(Size) 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供布局的“排列”传递的行为。 类可以重写此方法,以定义自己的“排列”传递行为。
protected:
virtual Size ArrangeOverride(Size finalSize) = ArrangeOverride;
Size ArrangeOverride(Size const& finalSize);
protected virtual Size ArrangeOverride(Size finalSize);
function arrangeOverride(finalSize)
Protected Overridable Function ArrangeOverride (finalSize As Size) As Size
参数
- finalSize
- Size
父级中最后一个区域,此对象应使用该区域来排列自身及其子级。
返回
在布局中排列元素之后使用的实际大小。
示例
此示例实现 ArrangeOverride 以自定义自定义面板实现的“排列”传递逻辑。 特别要注意代码的以下方面:
- 循环访问子级。
- 对于每个子级,调用 Arrange,使用 Rect ,其中 Height 和 Width 基于 DesiredSize, 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);
}
注解
此方法具有默认实现,该实现为大多数 FrameworkElement 派生类执行内置布局。 每当通过内部布局逻辑或你自己的应用代码调用 Arrange 时,ArrangeOverride 都提供 Arrange 的行为,包括你自己的其他类的任何 ArrangeOverride 方法。 如果要生成模板化控件,则 ArrangeOverride 逻辑定义控件的特定“排列”传递布局逻辑。
应用运行时元素如何通过布局过程的常规设计分为两个步骤:“度量”传递,然后是“排列”传递。 想要自定义布局处理的“排列”阶段的控制作者 (或面板作者) 应替代 ArrangeOverride。 实现模式应在每个可见子对象上调用 Arrange ,并将每个子对象的最终所需大小作为 finalRect 参数传递。 如果未调用 Arrange ,则不呈现子对象。
几个现有的非密封类提供此方法的替代实现。 突出的包括 StackPanel 和 Grid。 通常,ArrangeOverride 的行为会生成 一个 finalSize ,它不违反放置在布局容器本身上的任何用户定义的值。 例如, finalSize 通常不大于容器的 Height 和 Width,它考虑了影响内容区域的 Margin 或 Padding 值。 专门具有超出容器大小的场景的控件可能会返回更大的值,但使用该控件的任何人都必须考虑到由此导致的剪辑和定位问题。 ArrangeOverride 实现传递给每个子对象的 Arrange 的值通常是上一个 Measure 调用在 DesiredSize 中设置的值。