1

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

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

4

2 回答 2

2

WPF 的重点是,UIPanels决定其子元素的绘制位置。因此,控件本身对它们的位置没有发言权。在 UI 布局的度量传递中,仅考虑控件的大小。

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

但是在 中Grid,不可能有这样的事情。在这里,您设置了 which RowColumnwhatRowSpanColSpanshould child 。在 中DockPanel,您有不同的方式来停靠子元素。

而其他面板喜欢StackPanel并且WrapPanel没有这样的选项。

要解决此问题,您有 2 个选项:

  1. 保存每个元素中的所有内容。这将导致许多未使用的属性和缺乏可扩展性。如果有人想要实现他们自己的 Panel,它以不同的方式布局子元素并且需要为每个子元素设置其他类型的属性怎么办?
  2. 将这些属性保存在容器本身中。这为您节省空间和扩展整个事物的选项。

此外,附加属性可用于许多其他方面,而不是面板布局。

于 2012-12-08T22:45:37.687 回答
1

附加属性以这种方式实现,因此任何框架元素(例如 Line 或 TextBox)都可以与另一个对象(例如 Canvas 或 Grid)建立关系,而它对此一无所知。属性 likeLeft并且Top正确地属于容器控件,容器控件负责排列其子元素。

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

以下是关于附加属性的 MSDN 文章如何解释它:

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

于 2012-12-08T20:04:54.200 回答