Canvas属性和边距之间的差异

时间:2012-06-13 15:20:44

标签: c# .net wpf

使用SetValue与(例如)Canvas.LeftPropertyMargin属性有什么区别?

更清楚:

<Canvas>
   <Rectangle x:Name="rect">                         
</Canvas>

rect.SetValue(Canvas.LeftProperty, 10)

相当于

rect.Margin = new Thickness(10, 0, 0, 0)
是不是?

5 个答案:

答案 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.LeftMargin.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父级,它们就不起作用。