DependencyProperty.Register()或.RegisterAttached()

问题描述 投票:36回答:3

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

wpf workflow-foundation dependency-properties
3个回答
49
投票

我假设您的意思是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()注册)用作现有类的可扩展点。

希望澄清一下。


11
投票

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

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

附加属性are on MSDN的更多细节。


3
投票

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

有关详细信息,请参阅我对类似问题的回答:Difference between Attached and non-Attached Dependency Properties in Silverlight

© www.soinside.com 2019 - 2024. All rights reserved.