WPF,Silverlight与XAML读书笔记第三十一 - 可视化效果之布局概览 & 尺寸
说明:本系列基本上是《WPF揭秘》的读书笔记。在结构安排与文章内容上参照《WPF揭秘》的编排,对内容进行了总结并加入一些个人理解。
WPF中的布局管理的是父元素与子元素之间的交互,父元素与子元素一起决定他们最终的尺寸和位置。父元素会告诉它的子元素应该在哪里进行渲染,应该占用多少空间,但同时父元素也会询问子元素需要多少空间。布局/面板控件(参见此文)管理了WPF大部分布局操作。
所有可以布局或被布局的元素都是继承自UIElement。
用一个图来概括与布局相关的属性:
这其中蓝色线段所标注的是与尺寸相关的元素,我们将在本文后半部分详细介绍。
其中红色线条标注的是与位置相关的属性。
图中绿色标注了可能发生变换的位置,变换虽然不属于布局的内容,但是其既会影响尺寸,也会影响位置。
尺寸
Width与Height:
所有FrameworkElement均有这两个属性,它们是double类型,用于控制一个元素的宽和高。
MinHeight,MaxHeight,MinWidth和MaxWidth这几个属性指定宽和高可以接受的取值范围。MinHeight和MinWidth的默认值为0,MaxHeight和MaxWidth的默认值为Double.PositiveInfinity(XAML中可简写为"Infinity")。
当Height与MinHeight,MaxHeight;Width与MinWidth,MaxWidth同时设置时,只要Height与Width在这个范围内,则会优先采用这个Width与Height值。另一个原则是WPF会使元素尽可能的小。
提示:避免显式设置尺寸!
显示设置控件尺寸(特别是Button与Label之类的内容控件)会造成系统字体变化或者不同文化下部分语言会被截断。所以尽量活用布局控件来避免显示设置这个尺寸。
内幕:控件尺寸自动适用内容的原因
FrameworkElement的Height和Width的默认值是Double.NaN(区分大小写),这个值表示元素将与内容一般大。另外也可以把这两个值设置为Auto(不区分大小写),这些属性的LengthConverter类型转换器会将Auto自动转换为NaN。另外可以使用Double.IsNaN静态方法可以检测属性是否被设置为Double.NaN。
Framework中更复杂的尺寸相关属性:
-
DesiredSize:继承自UIElement,在元素的布局基于其它属性值时被计算出,如受其父元素的影响。
-
RenderSize:继承自UIElement,布局完成后的最终尺寸。
-
ActualHeight与ActualWidth:ActualHeight与RenderSize.Height,ActualWidth与RenderSize.Width是完全相同的。
这三个属性都是只读的,表示从布局的输出。由于无论元素是否被显示设置尺寸,或者设置了尺寸范围或者保留默认值。父元素的行为都会最终影响这些尺寸。所以获取上述输出有机会在元素即将呈现前来调整尺寸。
提示:以上这些属性的使用时机
由于每次布局更新时,这些属性都会发生变化。正确的使用方式是在LayoutUpdated事件的处理程序中访问这些属性。
Margin与Padding
Margin控制元素的外边界以外有多少空间,Padding控制的是元素边界以内的空间。每个FrameworkElement都有一个Margin属性,每个Control都有Padding属性。
Margin和Padding的类型为System.Windows.Thickness这个类接受的值可以是一个,两个或四个逗号分隔的浮点数三类。
-
当值有一个浮点数,它将被设置为上,下,左,右四个距离。
-
当值有两个浮点数,第一个被设置为左右距离,第二个被设置为上,下距离。
-
当值有四个浮点数,它们分别被放在左,上,右,下四个距离。
内幕:Thickness的转换器
Margin与Padding属性通过ThicknessConverter将逗号分隔的浮点数转换为Thickness的对象。另外Thickness的重载构造函数可以接受1个或4个浮点数。所以2个浮点数也是通过转换器映射到构造函数上。示例:
XAML:Margin="20, 5"
C#:MyLabel.Margin = new Thickness(20, 5, 20, 5);
提示:WPF的度量单位
WPF中使用的值(如设置给Width等的像素)是设备无关像素。这种像素代表1/96英寸。在一个标准的96DPI显示器上显示,这个设备无关像素与物理像素一致。
Visibility
Visibility定义在UIElement中,Visibility是System.Windows.Visibility枚举类型,其值如下:
-
Visible(可见):元素获得渲染并且参与布局。
-
Collapse(折叠):元素不可见并且不参与布局
-
Hidden(隐藏):元素不可见但参与布局。
一个Collapse元素尺寸为0,一个Hidden元素的尺寸还是原来的尺寸。
本文完
参考:
《WPF揭秘》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2011-10-24 WPF,Silverlight与XAML读书笔记第十二 - 新的WinRT框架