SetValue使用with(例如)Canvas.LeftProperty和MarginProperty之间有什么区别?
为了更清楚:
<Canvas>
<Rectangle x:Name="rect">
</Canvas>
是
rect.SetValue(Canvas.LeftProperty, 10)
相当于
rect.Margin = new Thickness(10, 0, 0, 0)
或不?
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 内的元素使用边距,因为你可以在不使用它的情况下进行更好的控制,但从技术上讲你可以。
它看起来一样,但在第一种情况下,画布可以让你rect正确地移动10。在第二步rect正确的10点。
根据您的目的使用其中一种方式。
编辑:如果更深入地了解 WPF 代码。在第一种情况下,在 Canvas 的ArrangeOverriderect中移动,在第二种情况下,在Rectangle的ArrangeOverride中移动。
对于直接在 a 中的元素Canvas,唯一的区别在于均值。最终的结果是完全一样的。
定位时Rectangle,布局引擎会将影响其位置的所有值相加。对于X坐标,这包括Canvas.Left和Margin.Left。
所以在一种情况下它正在添加10 + 0,而在另一种情况下它正在添加0 + 10。
所以选择你喜欢的那个。我个人更喜欢Canvas.Left这种情况,因为它似乎更符合上下文意义。
Canvas.Left
Canvas.Right
Canvas.Top
Canvas.Bottom
仅在画布容器内强制执行,它们不会改变它们所附加到的控件的宽度和高度。(left=10,right=10 不会拉伸到每边的边距为 10)
Margin.Left
Margin.Right
Margin.Top
Margin.Bottom
由设置它的对象控制,例如,它将在网格上的画布之外工作,并将更改任何控件的宽度和高度以强制其值(如果宽度和高度为 NaN)。
您可以使用TemplateBinding 或常规 Binding 在对象的模板内使用Margin属性,因为它是 DependencyProperty。这也调整了对象的宽度和高度。
Canvas 属性是附加到 FrameworkElement 的属性,允许定位可能没有 Margin 属性的元素。如果对象没有 Canvas 父级,它们将不起作用。