Canvas属性和Margin之间的区别

6

在使用SetValue设置属性(例如Canvas.LeftPropertyMargin)时,有什么区别吗?

更明确地说:

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

Is

rect.SetValue(Canvas.LeftProperty, 10)

等同于

rect.Margin = new Thickness(10, 0, 0, 0)

还是不?

5个回答

4
Margin属性用于确定元素周围的额外空间,几乎适用于所有类型的布局(StackPanel、Grid、ContentControls等)。
Canvas.LeftProperty(以及Top、Right和Bottom)仅适用于直接位于Canvas内部的元素。Canvas将使用这些值来确定对象的位置。对于形状元素,如Path,Canvas在确定位置时还会查看形状的位置数据。
从技术上讲,Canvas附加属性应该与形状的固有位置数据(如果有)以及Margin累积。您可以使用所有3个属性来修改位置。但通常您会尝试保持简单。
例如,矩形应该使用其Width和Height属性以及Canvas.Left和Canvas.Top。Path要么只依赖于其点数据,要么使用Canvas.Left和Canvas.Top进行偏移。您不应该在Canvas内部使用margin,因为没有使用它更好的控制方式,但从技术上讲您可以使用。

1

看起来一样,但在第一种情况下,画布将rect向右移动10个点。在第二种情况下,rect向右移动10个点。

根据您的目的使用其中一种方法。

编辑:如果更深入地查看WPF代码。在第一种情况下,rect在Canvas的ArrangeOverride中移动,在第二种情况下,在Rectangle的ArrangeOverride中移动。


好的,但是有什么区别(如果有的话)? - Nick

1

对于直接在Canvas中的元素,唯一的区别在于手段。最终结果完全相同。

当定位Rectangle时,布局引擎将汇总所有影响其位置的值。对于X坐标,这包括Canvas.LeftMargin.Left

因此,在一种情况下,它会添加10 + 0,而在另一种情况下,它会添加0 + 10

所以选择你喜欢的那个。就我个人而言,在这种情况下,我更喜欢Canvas.Left,因为它似乎更符合上下文意义。


0
您可以在对象的模板中使用TemplateBinding或者常规Binding来使用Margin 属性,因为它是一个DependencyProperty。这还会调整对象的宽度和高度。
Canvas属性是FrameworkElement的附加属性,允许定位可能没有Margin属性的元素。如果对象没有Canvas父级,则它们不起作用。

0
Canvas.Left
Canvas.Right
Canvas.Top
Canvas.Bottom

只有在画布容器内强制执行,它们不会改变控件的宽度和高度,它们被附加到的控件不会被拉伸以给出每侧10的边距(left=10,right=10不会被拉伸以给出每侧10的边距)

Margin.Left
Margin.Right
Margin.Top
Margin.Bottom

由设置它的对象控制,例如在网格上的画布之外工作,并将更改任何控件的宽度和高度以强制执行其值(如果宽度和高度为NaN)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接