5

SetValue使用with(例如)Canvas.LeftPropertyMarginProperty之间有什么区别?

为了更清楚:

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

rect.SetValue(Canvas.LeftProperty, 10)

相当于

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

或不?

4

5 回答 5

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。路径要么仅依赖其点数据,要么使用 Canvas.Left 和 Canvas.Top 抵消它。你不应该对 Canvas 内的元素使用边距,因为你可以在不使用它的情况下进行更好的控制,但从技术上讲你可以。

于 2012-06-13T15:31:49.100 回答
1

它看起来一样,但在第一种情况下,画布可以让你rect正确地移动10。在第二步rect正确的10点。

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

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

于 2012-06-13T15:26:33.657 回答
1

对于直接在 a 中的元素Canvas,唯一的区别在于均值。最终的结果是完全一样的。

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

所以在一种情况下它正在添加10 + 0,而在另一种情况下它正在添加0 + 10

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

于 2012-06-13T15:33:20.567 回答
0
Canvas.Left
Canvas.Right
Canvas.Top
Canvas.Bottom

仅在画布容器内强制执行,它们不会改变它们所附加到的控件的宽度和高度。(left=10,right=10 不会拉伸到每边的边距为 10)

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

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

于 2012-06-13T15:32:19.693 回答
0

您可以使用TemplateBinding 或常规 Binding 在对象的模板内使用Margin属性,因为它是 DependencyProperty。这也调整了对象的宽度和高度。

Canvas 属性是附加到 FrameworkElement 的属性,允许定位可能没有 Margin 属性的元素。如果对象没有 Canvas 父级,它们将不起作用。

于 2012-06-13T15:32:51.243 回答