|
对于Silverlight学习来说,首先要面对的应该是布局:你得把元素放到你想摆放的位置,然后是考虑元素的层次以及可见性,之后可能你想让它动起来,就学习动画,最后理解更深入之后,可能会开发如Behavior之类的行为,或者设置复杂的控件状态,模板。
很多教程是从使用Grid开始,然后是Canvas,StackPanel之类的控件,他教你怎样设置元素的位置。然后就没有下文,很少会去讲解布局的原理,不过如果是看Silverlight SDK,是能看到的。其实最好的教程就是Silverlight SDK,包括像两个不同的SL插件(即使它们在不同的浏览器窗口)之间的通信这些一般人没有注意到的特性,里面都是讲得清清楚楚。所以,建议不要花钱去买Silverlight相关的书。
其实,不是能使用Grid之类的就知道了布局,Silverlight布局包含更多的东西,理解布局系统有利于更深层的理解Silverlight,从而开发更得心应手。
遗憾的事初学者理解布局也许有点复杂,可能是因为其中的递归,但是我们生活中其实有很多递归系统的。我试着学习郭欣用铁路系统描述网络传输一样,也来构造这样一个场景。
布局原理
首先,所有元素的最顶层必须是一个容器(通常如Grid,Canvas,StackPanel等),然后在容器中摆放元素,容器中也可能包含容器。这里的容器就像行政长官一样,他们负责分配元素的空间。同样,首先顶层的容器一个一个的问自己的子元素:你想要多大的空间?如果子元素也是容器,它又继续向下递归,最后又顶层开始向上汇报。这就是所谓的测量。
测量完之后就是排列,这个时候每个容器知道自己每个子元素想要的空间大小,就按自己的实际情况进行分配。一致递归到最底层。
注意上述红色字体部分,通过前面的故事,我们知道,资金的发放完全由行政长官控制,不管下面想要多少,都是他说了算,他甚至可以一分钱都不给,或者给你超多你的预期的数目。
这里的容器也一样,容器拥有完全的分配权,不过这里容器不仅仅是分配空间,还决定元素的位置,因为空间总是跟位置相关的。也就是说,容器说想给你多大空间你就只有有那么大的空间可使用,容器想让你摆在什么位置,你就得乖乖呆着什么位置。
只不过,这里的容器是遵守规则的,它遵守开发者指定的规则:
Grid的规则是:我把我这个空间分成一格一格的格子,看起来有些像Table,在我里面的元素我完全按照附加属性Grid.Row,Grid.Column,Grid.RowSpan,Grid.ColumnSpan来决定其大小和位置。
Canvas的规则是:我读取附加属性Canvas.Left,Canvas.Right,Canvas.Top,Canvas.Bottom,并以此来决定元素的位置,我通常不限制元素开用空间
StackPanel的规则是:根据附加属性,我要么让元素横着排列,要么竖着排列。
聪明的你是不是立刻想到,我可不可以定义自己的规则呢?哈哈,当然可以!
比如,你可以让Panel里面的元素随机分布,并可让它们随机旋转一定角度,这不就是现在某些很酷的相册吗;你可以让元素排成一个圆形,这不就是Blend里面的例子吗;你可以让元素根据某个Path元素排列,这不就是PathListBox吗?如下图:
所以,你现在是不是觉得布局不是那么简单并且很好玩呢?
下面我们就来看怎么实现这么酷的东西!
基础框架-FrameworkElement
为Silverlight布局中涉及的对象提供公共API的框架。FrameworkElement还定义在Silverlight中与数据绑定,对象树和对象生存期功能区域相关的API。
继承层次结构:
System.Object
System.Windows.DependencyObject
System.Windows.UIElement
System.Windows.FrameworkElement
System.Windows.Controls.Border
System.Windows.Controls.Control
System.Windows.Controls.Panel
System.Windows.Shapes.Shape
NET技术:深入解读Silverlight的布局原理,转载需保留来源!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。