42

两者有什么区别,什么时候应该使用RegisterAttached()而不是.Register()?

4

3 回答 3

54

我假设您的意思是 DependencyProperty.Register 和 DependencyProperty.RegisterAttached。

DependencyProperty.Register 用于注册普通的DependencyProperty。您可以将它们视为常规属性,并增加它们可以参与 WPF 的 DataBinding、动画等的扭曲。事实上,它们在无类型的 DependencyObject.SetValue 之上作为普通属性(使用 get 和 set 访问器)公开/ 获取值。您将它们声明为您的类型的一部分。

另一方面,附加属性是不同的。它们被认为是一个可扩展性系统。如果您曾经在 Windows 窗体中使用过扩展器,它们有点相似。您将它们声明为类型的一部分,以用于另一种类型。

它们被大量用于与布局相关的信息。例如,Canvas 需要 Left/Top 坐标,Grid 需要 Row 和 Column,DockPanel 需要 Dock 信息等。如果所有这些都必须在每个可以布局的 Control 上声明,那将是一团糟。因此它们在相应的面板上声明,但在任何控件上使用。

如果需要,您可以使用相同的东西将任何信息附加到 DependencyObject。例如,只需声明一条您可以在 xaml 中设置的信息,以便稍后在现有类的样式中使用它就可以派上用场。

所以这两种 DependencyProperty 服务于一个非常不同的目的。常规属性(通过 Register() 注册)与普通属性一样用作类型接口的一部分。附加属性(通过 RegisterAttached() 注册)用作现有类的扩展点。

希望能澄清一点。

于 2009-05-27T05:04:51.313 回答
12

DependencyProperty.Register() 和 DependencyProperty.RegisterAttached() 之间的区别在于 .Register() 用于在 DependencyObject 上注册“常规”依赖属性,而 .RegisterAttached() 用于设置“附加”依赖属性。

两种类型的依赖属性之间的区别相当简单:常规依赖属性是在特定的 DependencyObject 上设置的,就像您设置任何其他 .NET 属性一样。另一方面,附加属性与特定的 DependencyObject(例如 Grid)相关联,但设置在完全独立的 DependencyObject 上,通常是定义附加属性的 DependencyObject 的子项(例如 Grid.Row,附加属性)在父网格的子节点上)。

有关附加属性的更多详细信息,请参见 MSDN

于 2009-05-27T00:19:12.400 回答
5

使用 Register 或 RegisterAttached 注册的属性可以使用 SetValue 和 GetValue 附加到任何 DependencyObject。但是,如果您将使用 Register 注册的属性附加到非 ownerType 类型的对象上,则不会使用其元数据(默认值除外)。这意味着 Inherits 或 AffectsMeasure 等属性不适用于这些属性。如果您对附加属性的元数据感兴趣,则应使用 RegisterAttached。

For details, see my answer to a similar question: Difference between Attached and non-Attached Dependency Properties in Silverlight

于 2011-09-19T07:18:29.347 回答