WPF/Silverlight为什么要使用Canvas.SetLeft()这样的方法?1个答案-提问时间:2013-10-05这样的语法,于是,便

1个答案-提问时间:2013-10-05
这样的语法,于是,便出现了Canvas.SetLeft()这样的方法。。另外Silverlight本身还只是Beta版本,所以最好别拿Silverlight说事儿。呵呵,我还是很喜欢WPF。总结这一篇Post...
WPF里的DependencyProperty(3)WPF里的DependencyProperty(2)我对EntityDataModel的一些理解Gadget开发实战总结2(ISeePinkProblem)Gadget开发实战总结1(Gadget调...
Word文档-34页-415.50KB的名称,它由第一个参数指定.这个Property的后缀不是可选的,虽说不按照这个规则编...WPF的动画中,你可以使用一些方法将一个Animation对象应用在某些属性上,动然后...
Word文档-50页-2783.50KBWPF/Silverlight动画的教程,但是均为使用Blend工具制作,或直接写在xaml代码内的...Canvas.SetLeft(rect,0);Canvas.SetTop(rect,0);}这里我创建了一个50*50象素,圆角...
PDF文档-59页-2116.59KBWPF/Silverlight中使用Storyboard修改过关联属性后,这些关联属性将被锁定,外界是...动画中我是这样做的,实践证明此方法确实达到的目的.方法五:以毒攻毒.既然是...
Canvas.SetLeft(uiElement,100.0);值得注意的是:如果需要来回反复...GetValue和SetValue是在托管代码中直接获取或设置对象属性的一种方法,如下面例子:<Rectanglex:...
本版专家分:42结帖率93.75%WPF中想调整椭圆的位置,可是设置了却不起作用,不知为何,请大侠支招。代码如下:privatevoidWindow_Loaded(objectsender,...
“为啥flex可以直接对控件的left,top这些属性直接操作,sl还要转一下。这个很难理解,难道是因为dp的好用?相对dp的使用flex的实现简单明了的多了”正好我最近在研究WPF,在这儿说说我的看法。可能大家大多就是在用WPF或者SL就是做界面,因此首先比较关心界面布局的问题,我就先以WPF的layout为例解释一些用法。WPF中的布局对象WPF中不可以给每个界面元素控件都加上"Left"或者"Top"这样的属性吗?其实不是,在一般的布局时,WPF为每个继承自FrameworkElement的组件提供了Margin这个属性,通过这个属性,我们可以轻松的设置四周的边距。再加上HorizontalAlignment和VerticalAlignment属性,我们足以完成一般的元素定位。最常用的,我们在Windows中随便拖一个Button,就会看到生成类似这样的XAML代码:<ButtonName="button1"Margin="0,0,28,7"HorizontalAlignment="Right"Width="53"button</Button除此之外,WPF还提供了另一种布局方式,也就是利用布局对象进行布局,这种布局方式最大的特点是,由父控件统一对子对象的布局进行管理。这样的控件有"Border"(单个子控件),"StackPanel"(流布局),"DockPanel"(停靠布局等),还有最常用的"Gird"。相信大家用这些布局控件已经很熟悉了。我们来看一些示例代码,看看WPF是怎样实现"由父控件统一对子对象的布局进行管理"的。以Canvas作为例子classCanvas:Panel{//定义DependencyProperty//publicstaticreadonlyDependencyPropertyLeftProperty=//publicstaticreadonlyDependencyPropertyTopProperty=protectedoverrideSizeMeasureOverride(SizeavailableSize){//这里计算所有子控件自身的期望尺寸大小foreach(UIElementeleinInternalChildren){ele.Measure(availableSize);}//这里返回自己(父控件)的测量大小,可用多大就多返回多大,并没有根据子控件变化returnavailableSize;}protectedoverrideSizeArrangeOverride(SizefinalSize){//这里计算每个子控件的位置,也就是对子控件进行布局foreach(UIElementeleinInternalChildren){//这个Rect用来指定子控件相对自己的位置RectitsRect=newRect(newPoint((double)ele.GetValue(LeftProperty),(double)ele.GetValue(TopProperty)),//*这句是关键ele.DesiredSize,ele.DesiredSize);ele.Arrange(itsRect);}returnfinalSize}}详细的布局过程可以参考一些书籍(强烈推荐很经典的《Application=Code+Markup:WPF程序设计指南》),这里不多说,注意ArrangeOverride方法中的newPoint((double)ele.GetValue(LeftProperty),(double)ele.GetValue(TopProperty)),这一句使用GetValue方法获得了每个子控件的Left和Top属性,然后据此对子控件进行定位。我不熟悉Flex,就和以前其他布局方式对比一下,比如Winform,Winform时代有个老大帮我们布局。老大说了,我们每个能参与布局的对象都有Left,Top,或者还有Position来指定Relative还是Absolute这样(我确实想到css去了),现在不一样了,因为“权力下放”,WPF把布局的权利直接下放给了布局控件,这就麻烦了,Canvas需要的是Left属性,Top属性,Grid可能需要Row属性,Column属性,DockPanel可能需要Dock属性,那怎么办呢?于是我们就使用AttachedProperty,把属性定义在各个“小老大”下面,下面参与布局的“小兄弟”就使用AttachedProperty的方式来设置和读取这些属性的值。WhyWPFRocks(CustomLayoutPanelShowcase)其实,如果你坚定的想为每个“小兄弟”建立一个Left和Top的话,你完全可以自己实现类似如下的代码:classMyFrameworkElement:FrameworkElement{publicintLeft{get;}publicintTop{get;}//}classMyCanvas:Canvas{protectedoverrideSizeArrangeOverride(SizefinalSize){foreach(UIElementeleinInternalChildren){MyFrameworkElementmele=eleasMyFrameworkElement;if(mele!=null){RectitsRect=newRect(newPoint(mele.Left,mele.Top),ele.DesiredSize,ele.DesiredSize);ele.Arrange(itsRect);}}returnbase.ArrangeOverride(finalSize);}}不过插一句,WPF中并没有所谓的特定的“布局对象”,其实每一个视觉对象(Visual)都可以为自己的子对象(们)安排布局。形成模式抛开布局不谈,从设计模式和面向对象的设计来说,这种设置属性值的方式可以算一种很有意义的模式,他很漂亮的分离了属性(Left),拥有属性的对象(Element),定义属性的对象(Canvas),属性值四者之间的耦合关系。DependencyProperty和AttachedProperty不仅在layoutsystem中有很大的用处,在数据绑定,动画支持,资源,风格等都有很好的应用。当然,任何复杂的设计都是有代价的,这种方式最大的代价也许是性能,虽然在值得存储上WPF进行了很多优化(可以参考我的另一篇即将发布的Post),但性能损失肯定存在。另一方面,复杂的设计必定会增加用户(我们程序员)使用的复杂度,也就是我们必须使用GetValue或者是SetValue方法去获取值了。不过在使用复杂度上面,WPF进行了一些官方的规范处理,他希望普通的DependencyProperty都能被封装成名为"CLRWapper"的get/set方法,AttachedProperty封装成类似Canvas.SetLeft(v,150)这样的语法,于是,便出现了Canvas.SetLeft()这样的方法。。另外Silverlight本身还只是Beta版本,所以最好别拿Silverlight说事儿。