代码改变世界

Windows Presentation Foundation系列(4)----公共布局属性

2011-07-01 16:55  libiver  阅读(571)  评论(0编辑  收藏  举报

声明:欢迎任何人和组织转载本blog中文章,但必须标记文章原始链接和作者信息。

本文链接:http://www.cnblogs.com/leezhm/archive/2011/07/01/2095649.html

开拓进取的小乌龟------->cnBlogs 点滴点点滴滴 Blog

在WPF的布局中,除了不同的面板使用的不同的附加属性外,还有一些公共的布局属性。它们的存在,让布局系统更加功能强大,控制更精确。它们分别是

属性 说明
Width 为Element指定一个宽度。
Height 为Element指定一个高度。
MinWidth 允许的元素最小宽度。
MinHeight 允许的元素最小高度。
MaxWidth 允许的元素最大宽度。
MaxHeight 允许的元素最大高度。
HorizontalAlignment 控制元素的水平位置,当元素小于可用空间的时候。
VerticalAlignment 控制元素的垂直位置,当元素小于可用空间的时候。
Margin 设置元素与周围边框的间距。
Padding 设置元素边框与元素内部内容之间的间距
Visibility 设置元素在布局系统中是否可见。
FlowDirection 设置文本的方向。
Panel.ZIndex 设置元素的Z轴,控制元素的现实顺序。
RenderTransform 对元素设置一个转换,不影响布局系统。
LayoutTransform 对元素设置一个转换,会影响布局系统,触发系统再次进行布局。
上面表格中的所有属性,除了Padding和Panel.ZIndex外,其余的都是FrameworkElement类的属性,大部分的WPF控件都是集成自FrameworkElement。
 
(1) Width和Height
通过Width和Height可以设置一个控件的精确的固定大小,但是在实际应用中我们应该尽量避免使用它俩,更应该让控件来决定自身的大小,通过允许控件根据内容来调整大小,方便用户改变界面,布局重新调整。因为如果你设置了固定的大小,布局在每一次调整中总是尽量试图遵循你的选择,满足固定尺寸,进行多次运算。
 
(2) MinWidth、MinHeight、MaxWidth和MaxHeight
明显它们是设置控件大小的下限和上限的,在你需要限制面板的布局的时候,给你提供了最好最合适的方法。但是也是在合理的范围内有效,比如你把MinWidth设置10000,这个明显就不能被实现,WPF无法满足你的要求。
 
(3) HorizontalAlignment和VerticalAlignment
当父元素中可用空间找过了子元素所需要的空间的时候,布局会涉及到剩余空间的填充的问题。此时可以通过这些属性来控制子元素的位置。比如一个Orientation设置成Vertical的StackPanel通常会与其中的最宽的一个子元素一样宽,这就意味着其它的较窄的元素与面板边界会有一定的额外空间,此时必须使用对齐方式,来决定元素怎么样来处理剩余的空间。
这两个属性的默认值都是Stretch,即是当有额外的空间的时候,元素被放大来填充空间。HorizontalAlignment还可以设置为Center,Left,Right,而VerticalAlignment可以设置为Center,Bottom和Top。具体通过下面几张图片内容对比来理解上面这些。

      当控件分别设置了MaxWidth和MaxHeight,而且面板有额外的可用空间的时候,控件会以它的MaxWidth和MaxHeight的值来布局显示。当面板无额外的空间,但是比空间设置的MinWidth和MinHeight大的时候,控件会以布局可用空间大小来进行布局。当布局大小小于控件设置MinWidth和MinHeight的时候,控件不会改变大小,但是如UniformGrid这样的面板中会进行裁

 

      当设置了控件的HorizontalAlignment和VerticalAlignment之后,面板会分别以MinWidth和MinHeight来布局控件。所以当同时设置横向和纵向后,控件会以最小的尺寸来布局。而当控件同时设置了Width和Height的固定值之后,面板会以固定值来显示控件。

(4) Margin

        Margin的作用是调整元素周围的空间,与面板边缘的间距(不完全准确的,更准确的是与周围元素边缘的间距)。关于具体的使用方法,看MSDN的截图:

(5)Padding

       Padding是指定元素边框与内部内容之间的间距。由于并不是所有的WPF元素都有内部内容,所以并非所有的WPF元素都有Padding属性的。具体见MSDN解释:

(6)Visibility & FlowDirection & Panel.ZIndex

       Visibility决定了元素是否可见,由枚举System.Windows.Visibility来决定其值,由于它不同的枚举值会涉及到是否影响布局,所以要谨慎。如下表为具体值:

成员名称

说明

Visible

显示元素

Hidden

不显示元素,但是为元素保留布局空间

Collapsed

不显示元素,且不为元素保留布局空间

 
FlowDirection可以控制文本的方向(注:虽然它主要是用来控制文本方向的,但是它同样对WrapPanel面板起作用,影响到WrapPanel中元素排列的顺便,左到右,或者右到左),默认情况下是基于系统的本地设置。
 
Panel.ZIndex是一个附加属性,决定了重叠的两个元素的显示顺序。默认情况下,元素的ZIndex是由它们定义的顺序来决定的,但是可以通过显式指定ZIndex的值来决定元素的显示顺序。
 
(7)RenderTransform & LayoutTransform
在WPF中可以使用RenderTransform和LayoutTransform进行元素的的缩放,旋转,虽然效果一样,但是他们之间也有不同。LayoutTransform变换引起的变化将被纳入布局系统的计算范围,而RenderTransform变换引起的变法则被忽略。显然每一次LayoutTransform变换都会引起面板触发一个布局,在一些不必要的情况下,肯定会大量消耗系统的资源的。所以在满足要求的情况下,要禁止使用layoutTransform的。
简单实例通过如下两张截图来理解:
 

        显然,通过上面的对比,LayoutTransform引起了面板布局的变化,而RenderTransform的变法则被忽略了,这是因为RenderTransform是在布局之后,呈现之前应用的,而LayoutTransform则是在布局之前应用的。

 

总结:上面简单介绍了几个公共的布局属性,具体的应用还需要在实践中去总结,熟能生巧的.