在WPF中,要设置椭圆的垂直位置,例如,使用方法Canvas.SetTop(ellipseObj, y)
。也就是说,该位置存储在类 Canvas中,不存储在包含椭圆的画布对象中!
我喜欢明白为什么!那么,为什么附加属性存储为类变量?
答案 0 :(得分:2)
WPF的意思是,UI Panels
决定了他们的子元素的绘制位置。因此,控件本身无法说明它们的位置。在UI布局的度量传递中,仅考虑控件的大小。
在您的情况下,您使用Canvas
作为示例,这是非常短视的。 Canvas只是布局子控件的几种可能方法之一,只是它的设计允许精确定位它的子元素。因此,能够为每个孩子设置Top和Left值是有意义的。需要注意的是,Canvas是布局UI最少的建议方式。
但是在Grid
中,没有这样的事情是可能的。在这里,您可以设置应该由孩子拥有的Row
,Column
以及RowSpan
和ColSpan
。在DockPanel
中,您可以使用不同的方法来停靠子元素。
其他小组如StackPanel
和WrapPanel
没有这样的选择。
要解决此问题,您有两个选择:
此外,Attached Properties对于许多其他内容非常有用,而不是面板布局。
答案 1 :(得分:1)
附加属性以这种方式实现,这样任何框架元素(比如Line或TextBox)都可以被赋予与另一个对象无关的对象(比如Canvas或Grid)的关系。像Left
和Top
这样的属性正确属于容器控件,它负责安排子元素。
您可以将其视为visitor pattern - Canvas容器能够有效地修改任何子元素的行为,而无需实际更改这些元素的结构。
以下是MSDN article on attached properties解释它的方式:
附加属性的一个目的是允许不同的子元素为在父元素中实际定义的属性指定唯一值。