使用SetValue
与(例如)Canvas.LeftProperty
和Margin
属性有什么区别?
更清楚:
<Canvas>
<Rectangle x:Name="rect">
</Canvas>
时
rect.SetValue(Canvas.LeftProperty, 10)
相当于
rect.Margin = new Thickness(10, 0, 0, 0)
是不是?
答案 0 :(得分:4)
Margin属性与每个元素一起使用以确定对象周围的额外空间。它适用于几乎所有类型的布局(StackPanel,Grid,ContentControls等)
Canvas.LeftProperty(以及Top,Right和Bottom)仅适用于直接位于Canvas内部的元素。 Canvas将使用这些值来确定对象的位置。对于像Path这样的Shape元素,Canvas在确定位置时也会查看Shape的位置数据。
从技术上讲,Canvas附加属性应该与Shape(如果有)的固有位置数据以及Margin一起累积。您可以使用全部3来修改位置。但通常你会试着保持简单。
例如,Rectangle应使用其Width和Height属性以及Canvas.Left和Canvas.Top。 Path只是依赖于它的点数据,或者它会用Canvas.Left和Canvas.Top来抵消它。你不应该为Canvas中的元素使用margin,因为你可以在不使用它的情况下更好地控制它,但是你在技术上可以。
答案 1 :(得分:1)
它看起来相同,但在第一种情况下,画布会在rect
点向右移动10
。在rect
点向右移动10
。
根据您的目的使用这种方式之一。
编辑:如果更深入地了解WPF代码。在第一种情况下,rect
在Canvas的ArrangeOverride中移动,第二种情况在Rectangle的ArrangeOverride中移动。
答案 2 :(得分:1)
对于直接在Canvas
中的元素,唯一的区别在于均值。最终结果完全相同。
当定位Rectangle
时,布局引擎会将影响其位置的所有值加在一起。对于X
坐标,这包括Canvas.Left
和Margin.Left
。
因此,在一种情况下,它正在添加10 + 0
,而在另一种情况下,它正在添加0 + 10
。
所以选择你喜欢的任何一个。我个人在这种情况下更喜欢Canvas.Left
,因为它似乎更具有语境感。
答案 3 :(得分:0)
Canvas.Left
Canvas.Right
Canvas.Top
Canvas.Bottom
仅在画布容器内强制执行,它们不会改变它们所附加控件的宽度和高度。 (左= 10,右= 10不会延伸到每边10的余量)
Margin.Left
Margin.Right
Margin.Top
Margin.Bottom
由被设置的对象控制,它将在网格上的Canvas之外工作,并且将改变任何控件的宽度和高度以强制它的值(如果宽度和高度是NaN)。
答案 4 :(得分:0)
您可以使用TemplateBinding或常规Binding在对象模板中使用Margin属性,因为它是DependencyProperty。这也可以调整对象的宽度和高度。
Canvas属性是FrameworkElement的附加属性,允许定位可能没有Margin属性的元素。如果对象没有Canvas父级,它们就不起作用。