FrameworkElement.ArrangeOverride 方法
2013/3/11
提供 Windows Phone 布局的排列处理过程的行为。 类可以重写该方法来定义其自己的排列处理过程行为。
程序集: System.Windows(位于 System.Windows.dll 中)
参数
- finalSize
- 类型: System.Windows.Size
父级中此对象应用来排列自身及其子元素的最终区域。
此方法具有可为多数 Windows Phone FrameworkElement 派生类执行内置布局的默认实现。
每次通过内部布局逻辑或应用程序代码调用该方法时,ArrangeOverride 有效地提供 Arrange 的其他实现。 如果您正在生成可发布的内容控件,ArrangeOverride 逻辑定义了您的控件的特定“排列”的处理过程布局逻辑。
对继承者的说明对于 Windows Phone,在布局中调整元素大小和定位元素的方法可分为两个步骤: 测量处理过程,然后排列处理过程。 主题 Windows Phone 的布局中对此技术进行了更详细的说明。
要自定义布局处理的排列处理过程的控件作者(或面板作者)应重写 ArrangeOverride。 实现模式应在每个可见子对象上调用 Arrange,然后将每个子对象的最终所需大小作为 finalRect 参数进行传递。 包含可见子对象的容器应在每个子对象上调用 Arrange;否则,将不会呈现子对象。
一些现有的非密封 Windows Phone 类提供此方法的重写实现。 其中主要的类包括: StackPanel.ArrangeOverride 和 Grid.ArrangeOverride。
通常,ArrangeOverride 的行为将生成不会违反放置在布局容器自身上的任何用户定义的值的 finalSize。 例如,考虑到影响内容区域的 Margin 或 Padding 值,finalSize 通常不大于容器的 Height 和 Width。 有专门应对超出容器大小的方案的控件能够返回更大的值,但必须要考虑到由这种行为导致的裁剪和定位问题。
ArrangeOverride 实现传递给每个子对象的 Arrange 的值通常是由该对象上的前一个度量处理过程在 DesiredSize 中设置的值。 但是,这可能会因容器启用的特定布局功能而异。
下面的示例实现了 ArrangeOverride,以便为自定义面板实现来自定义排列处理过程逻辑。 请特别注意代码的以下方面:
遍历子级。
对于每个子级,使用 Rect(其中 Height 和 Width 基于 DesiredSize,X 和 Y 基于特定于面板的逻辑)调用 Arrange。
返回其大小(在此情况下,此简单面板返回固定大小而不是通过累计排列的 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); } // Calculate point origin of the Block you are in protected Point GetOrigin(int blockNum, int blocksPerRow, Size itemSize) { // Get row number (zero-based) int row = (int)Math.Floor(blockNum / blocksPerRow); // Get column number (zero-based) int column = blockNum - blocksPerRow * row; // Calculate origin Point origin = new Point(itemSize.Width * column, itemSize.Height * row); return origin; }