本主题描述 Windows Presentation Foundation (WPF) 布局系统。了解在构造外观醒目、性能优良的用户界面时如何以及何时进行布局计算是非常重要的。
布局系统
术语“布局”描述测量和排列 Panel 元素的 Children 集合的成员、然后在屏幕上绘制它们的过程。这是一个计算密集型过程,即 Children 集合越大,执行的计算次数就越多。根据拥有该集合的 Panel 元素所定义的布局行为,还可能会增加复杂性。如果不需要较为复杂的 Panel(如 Grid),则可以使用构造相对简单的布局(如 Canvas),这种布局可产生更佳的性能。
每当子 UIElement 改变其位置时,布局系统就可能触发一个新的处理过程。因此,了解哪些事件会调用布局系统就很重要,因为不必要的调用可能导致应用程序性能变差。
简单地说,布局是一个递归系统,实现在屏幕上对元素进行大小调整、定位和绘制。布局系统为 Children 集合的每个成员完成两个处理过程:测量处理过程和排列处理过程。每个子 Panel 均提供自己的 MeasureOverride 和 ArrangeOverride 方法,以实现自己特定的布局行为。不论何时调用布局系统,都会发生以下系列事件。
子 UIElement 通过首先测量它的核心属性来开始布局过程。
计算在 FrameworkElement 上定义的大小调整属性,例如 Width、Height 和 Margin。
应用 Panel 特定逻辑,例如 Dock 方向或堆栈 Orientation。
测量所有子级后排列内容。
Children 集合绘制到屏幕。
如果其他 Children 添加到集合、应用 LayoutTransform 或调用 UpdateLayout 方法,会再次调用此过程。
下面的小节将更详尽地定义此过程及其调用方式。
元素边界框
在 Windows Presentation Foundation (WPF) 中构思应用程序布局时,了解环绕所有元素的边界框非常重要。这有助于您理解布局系统的行为。布局系统使用的每个 FrameworkElement 可以被视为是嵌入到布局分区中的矩形。LayoutInformation 类会公开,可以返回元素布局分配的几何边界或槽。矩形的大小是由系统通过计算可用屏幕空间、任意约束的大小、布局特定属性(如边距和填充)及父 Panel 元素的个别行为来确定的。通过处理此数据,系统将能够计算给定的 Panel 的所有子级的位置。牢记在父元素上定义的哪些大小调整特性(如 Border)会影响其子级,这非常重要。
例如,请考虑下面的简单布局方案。
可以使用以下可扩展应用程序标记语言 (XAML) 来实现此布局。
此单独的 TextBlock 元素是在 Grid 内承载的,而文本仅填充在其所在列的左上角,为 TextBlock 分配的空间实际更大。可以使用 GetLayoutSlot 方法检索任意 FrameworkElement 的边界框。使用此方法,TextBlock 元素的边界框是叠加的,这可能是因为 TextBlock 是在 Grid(它是允许共享布局坐标的 Panel 元素)内承载的。
现在很明显该元素由白线环绕,分配给 TextBlock 元素的分区实际远远大于其填充的空间。由于还有其他元素添加到 Grid,此分配可能会收缩或扩展,这取决于所添加元素的类型和大小。
将会使用 GetLayoutSlot 方法(它是一项用于显示元素边界框的有用技术)返回 TextBlock 的布局槽并将其转换成 Path。
[1] [2] 下一页