DependencyProperty.Register()或.RegisterAttached()

San*_*ken 39 wpf dependency-properties workflow-foundation

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

Den*_*ler 50

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

希望澄清一下.

  • 您也可以在其他对象上设置****非附加属性的依赖项属性:`this.button.SetValue(TextBox.TextProperty,"text");`(其中`this.button`的类型为`System.Windows .Controls.Button`).这非常好,所以答案不是很完整.必须有更多. (2认同)

Nic*_*ong 11

你的意思是DependencyProperty.Register()DependencyProperty.RegisterAttached()吗?MSDN未列出DependencyProperty.Attach()或DependencyProperty.AttachRegistered().

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

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

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


srg*_*stm 5

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

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