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揭秘》

原文地址:https://www.cnblogs.com/lsxqw2004/p/4629137.html