DependencyProperty.Register()或.RegisterAttached()

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

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

DependencyProperty.Register用于注册正常的DependencyProperty。 你可以看到那些只是普通的属性,join了他们可以参与WPF的DataBinding,animation等等的function。事实上,他们被暴露为正常的属性(使用get和set访问器)在无types的DependencyObject.SetValue之上/ GetValue。 你声明这些是你的types的一部分。

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

他们用于布局相关的信息很多。 例如,Canvas需要左/顶坐标,Grid需要一个Row和一个Column,DockPanel需要一个Dock信息等。如果所有这些都必须在每个可以被布置的控件上声明,那将是一团糟。 所以他们在相应的面板上声明,但在任何控制上使用。

如果需要,可以使用相同的方法将任何信息附加到DependencyObject。 它可以派上用场,只需要声明一段信息,你可以在xaml中设置这个信息,以便稍后在现有类的样式中使用。

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

希望澄清一点。

你的意思是DependencyProperty.Register()和DependencyProperty.RegisterAttached() ,偶然吗? MSDN不列出一个DependencyProperty.Attach()或DependencyProperty.AttachRegistered()。

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

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

附加属性的更多细节在MSDN上 。

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

有关详细信息,请参阅我对类似问题的回答: Silverlight中的附加和非附加依赖项属性之间的区别