例如,在 WPF 中,要设置椭圆的垂直位置,可以使用 方法 Canvas.SetTop(ellipseObj, y)
。也就是说,位置存储在类Canvas 中,而不是存储在包含椭圆的画布对象中!
我想明白为什么!那么,为什么附加属性存储为类变量?
例如,在 WPF 中,要设置椭圆的垂直位置,可以使用 方法 Canvas.SetTop(ellipseObj, y)
。也就是说,位置存储在类Canvas 中,而不是存储在包含椭圆的画布对象中!
我想明白为什么!那么,为什么附加属性存储为类变量?
WPF 的重点是,UIPanels
决定其子元素的绘制位置。因此,控件本身对它们的位置没有发言权。在 UI 布局的度量传递中,仅考虑控件的大小。
在您的情况下,您正在使用Canvas
作为示例,这是非常短视的。Canvas 只是为数不多的布局子控件的可能方法之一,并且只有它被设计为允许精确定位它的子元素。因此,能够为每个孩子设置 Top 和 Left 值是有意义的。需要注意的是,Canvas 是最不明智的 UI 布局方式。
但是在 中Grid
,不可能有这样的事情。在这里,您设置了 which Row
、Column
whatRowSpan
和ColSpan
should child 。在 中DockPanel
,您有不同的方式来停靠子元素。
而其他面板喜欢StackPanel
并且WrapPanel
没有这样的选项。
要解决此问题,您有 2 个选项:
此外,附加属性可用于许多其他方面,而不是面板布局。
附加属性以这种方式实现,因此任何框架元素(例如 Line 或 TextBox)都可以与另一个对象(例如 Canvas 或 Grid)建立关系,而它对此一无所知。属性 likeLeft
并且Top
正确地属于容器控件,容器控件负责排列其子元素。
您可以将其视为访问者模式—— Canvas 容器能够有效地修改任何子元素的行为,而无需实际更改这些元素的结构。
以下是关于附加属性的 MSDN 文章如何解释它:
附加属性的一个目的是允许不同的子元素为在父元素中实际定义的属性指定唯一值。