C# WPF画矩形,下面一句话是什么意思啊: Canvas.SetLeft(rect, Math.Min(p.X, location.X));

“为啥flex可以直接对控件的left,top这些属性直接操作,sl还要转一下。这个很难理解,难道是因为dp的好用?相对dp的使用flex的实现简单明了的多了”
正好我最近在研究WPF,在这儿说说我的看法。可能大家大多就是在用WPF或者SL就是做界面,因此首先比较关心界面布局的问题,我就先以WPF的layout为例解释一些用法。
WPF中的布局对象
WPF中不可以给每个界面元素控件都加上"Left"或者"Top"这样的属性吗?其实不是,在一般的布局时,WPF为每个继承自FrameworkElement的组件提供了Margin这个属性,通过这个属性,我们可以轻松的设置四周的边距。再加上HorizontalAlignment和VerticalAlignment属性,我们足以完成一般的元素定位。最常用的,我们在Windows中随便拖一个Button,就会看到生成类似这样的XAML代码:HorizontalAlignment="Right"Width="53"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,