两者之间有什么区别,何时应该使用RegisterAttached()而不是.Register()?
答案 0 :(得分:48)
我假设您的意思是DependencyProperty.Register和DependencyProperty.RegisterAttached。
DependencyProperty.Register用于注册普通的DependencyProperty。您可以将它们视为常规属性,并附加扭曲,它们可以参与WPF的DataBinding,动画等。 实际上,它们作为普通属性(使用get和set访问器)公开在无类型DependencyObject.SetValue / GetValue之上。 您将这些声明为您的类型的一部分。
另一方面,附加属性是不同的。它们是指可扩展性系统。如果您曾在Windows窗体中使用Extender,它们有点类似。 您将它们声明为类型的一部分,以便在另一种类型上使用。
它们用于布局相关信息。例如,Canvas需要Left / Top坐标,Grid需要一个Row和一个Column,DockPanel需要一个Dock信息等。如果所有这些必须在每个可以布局的Control上声明,那将是一团糟。所以它们在相应的面板上声明,但在任何Control上使用。
如果需要,可以使用相同的东西将任何信息附加到DependencyObject。只需声明一段可以在xaml中设置的信息就可以派上用场,以便稍后在现有类的样式中使用。例如。
所以这两种DependencyProperty服务于一个非常不同的目的。常规属性(通过Register()注册)与普通属性一样,用作类型接口的一部分。附加属性(通过RegisterAttached()注册)用作现有类的可扩展点。
希望澄清一点。
答案 1 :(得分:9)
DependencyProperty.Register()和DependencyProperty.RegisterAttached()之间的区别在于.Register()用于在DependencyObject上注册“常规”依赖项属性,而.RegisterAttached()用于设置“附加”依赖属性。
两种类型的依赖项属性之间的差异相当简单:在特定的DependencyObject上设置常规依赖项属性,就像使用任何其他.NET属性一样。另一方面,附加属性与特定的DependencyObject(例如Grid)相关联,但是在完全独立的DependencyObject上设置,DependencyObject通常是定义附加属性的DependencyObject的子项(例如,Grid.Row,附加属性,设置)在父网格的子节点上。)
有关附加属性的更多详细信息are on MSDN。
答案 2 :(得分:3)
使用Register或RegisterAttached注册的属性可以使用SetValue和GetValue附加到任何DependencyObject。但是,如果将Register注册的属性附加到ownerType以外的类型的对象,则不会使用其元数据(默认值除外)。这意味着诸如Inherits或AffectsMeasure之类的属性不适用于这些属性。如果您对附加属性的元数据感兴趣,则应使用RegisterAttached。
有关详细信息,请参阅我对类似问题的回答:Difference between Attached and non-Attached Dependency Properties in Silverlight