在使用SetValue
设置属性(例如Canvas.LeftProperty
和Margin
)时,有什么区别吗?
更明确地说:
<Canvas>
<Rectangle x:Name="rect">
</Canvas>
Is
rect.SetValue(Canvas.LeftProperty, 10)
等同于
rect.Margin = new Thickness(10, 0, 0, 0)
还是不?
看起来一样,但在第一种情况下,画布将rect
向右移动10
个点。在第二种情况下,rect
向右移动10
个点。
根据您的目的使用其中一种方法。
编辑:如果更深入地查看WPF代码。在第一种情况下,rect
在Canvas的ArrangeOverride中移动,在第二种情况下,在Rectangle的ArrangeOverride中移动。
对于直接在Canvas
中的元素,唯一的区别在于手段。最终结果完全相同。
当定位Rectangle
时,布局引擎将汇总所有影响其位置的值。对于X
坐标,这包括Canvas.Left
和Margin.Left
。
因此,在一种情况下,它会添加10 + 0
,而在另一种情况下,它会添加0 + 10
。
所以选择你喜欢的那个。就我个人而言,在这种情况下,我更喜欢Canvas.Left
,因为它似乎更符合上下文意义。
Canvas.Left
Canvas.Right
Canvas.Top
Canvas.Bottom
只有在画布容器内强制执行,它们不会改变控件的宽度和高度,它们被附加到的控件不会被拉伸以给出每侧10的边距(left=10,right=10不会被拉伸以给出每侧10的边距)
Margin.Left
Margin.Right
Margin.Top
Margin.Bottom
由设置它的对象控制,例如在网格上的画布之外工作,并将更改任何控件的宽度和高度以强制执行其值(如果宽度和高度为NaN)。