为什么附加属性存储为类变量?

时间:2012-12-08 19:12:54

标签: .net wpf attached-properties

在WPF中,要设置椭圆的垂直位置,例如,使用方法Canvas.SetTop(ellipseObj, y)。也就是说,该位置存储在 Canvas中,存储在包含椭圆的画布对象中!

我喜欢明白为什么!那么,为什么附加属性存储为类变量?

2 个答案:

答案 0 :(得分:2)

WPF的意思是,UI Panels决定了他们的子元素的绘制位置。因此,控件本身无法说明它们的位置。在UI布局的度量传递中,仅考虑控件的大小。

在您的情况下,您使用Canvas作为示例,这是非常短视的。 Canvas只是布局子控件的几种可能方法之一,只是它的设计允许精确定位它的子元素。因此,能够为每个孩子设置Top和Left值是有意义的。需要注意的是,Canvas是布局UI最少的建议方式。

但是在Grid中,没有这样的事情是可能的。在这里,您可以设置应该由孩子拥有的RowColumn以及RowSpanColSpan。在DockPanel中,您可以使用不同的方法来停靠子元素。

其他小组如StackPanelWrapPanel没有这样的选择。

要解决此问题,您有两个选择:

  1. 保存每个元素中的所有内容。这将导致许多未使用的属性和缺乏可扩展性。如果有人想要实现他们自己的Panel,以不同的方式布局孩子并且需要为每个孩子提供其他类型的财产呢?
  2. 将这些属性保存在容器本身中。这为您提供了空间节省和选项来扩展整个事物。
  3. 此外,Attached Properties对于许多其他内容非常有用,而不是面板布局。

答案 1 :(得分:1)

附加属性以这种方式实现,这样任何框架元素(比如Line或TextBox)都可以被赋予与另一个对象无关的对象(比如Canvas或Grid)的关系。像LeftTop这样的属性正确属于容器控件,它负责安排子元素。

您可以将其视为visitor pattern - Canvas容器能够有效地修改任何子元素的行为,而无需实际更改这些元素的结构。

以下是MSDN article on attached properties解释它的方式:

  

附加属性的一个目的是允许不同的子元素为在父元素中实际定义的属性指定唯一值。