2009-05-26 10 views

回答

48

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

DependencyProperty.Register用於註冊正常的DependencyProperty。你可以看到那些只是普通的屬性,加入了他們可以參與WPF的DataBinding,動畫等的部分。 事實上,它們在無類型的DependencyObject的頂部作爲普通屬性(使用get和set訪問器)公開。 SetValue/GetValue。 你聲明那些是你的類型的一部分。

另一方面,附加屬性是不同的。它們被認爲是一個可擴展性系統。如果您曾經在Windows Forms中使用Extender,它們有點類似。 您將它們聲明爲類型的一部分,以用於其他類型。

他們用於佈局相關的信息很多。例如,Canvas需要Left/Top座標,Grid需要一個Row和一個Column,DockPanel需要一個Dock信息等。如果必須在每個可以進行佈局的控件上聲明所有這些,這將是一團糟。因此它們在相應的面板上聲明,但在任何控件上使用。

如果需要,您可以使用相同的方法將任何信息附加到DependencyObject。例如,它可以派上用場,只需聲明一段可以在xaml中設置的信息,以便稍後用於現有類的樣式。

因此,這兩種DependencyProperty服務於一個非常不同的目的。常規屬性(通過Register()註冊)與普通屬性一樣用作類型接口的一部分。附加屬性(通過RegisterAttached()註冊)用作現有類的可擴展性點。

希望能夠澄清一點。

+1

所以連接可以用來添加屬性,你沒有自己的班?這是區別嗎? – Vaccano

+0

非常感謝你! –

+2

你可以設置依賴屬性,它不是附加在其他對象上的屬性:'this.button.SetValue(TextBox.TextProperty,「text」);'(其中'this.button'的類型是'System。 Windows.Controls.Button')。這非常好,所以答案並不完整。必須有更多。 – bitbonk

9

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

DependencyProperty.Register()和DependencyProperty.RegisterAttached()之間的區別在於.Register()用於在DependencyObject上註冊'regular'依賴項屬性,而.RegisterAttached()用於設置'attached '依賴屬性。

兩種類型的依賴項屬性之間的區別是相當直接的:常規依賴項屬性在特定的DependencyObject上設置,就像其他任何.NET屬性一樣。另一方面,附加屬性與特定的DependencyObject(例如Grid)相關聯,但是設置在完全獨立的DependencyObject上,通常是定義附屬屬性的DependencyObject子節點(例如Grid.Row,附屬屬性,設置對一個父級網格的孩子)。

有關附加屬性的更多細節are on MSDN

3

使用SetValue和GetValue可以將註冊Register或RegisterAttached的屬性附加到任何DependencyObject。但是,如果將使用Register註冊的屬性附加到ownerType以外的對象,則不會使用其元數據(默認值除外)。這意味着諸如Inherits或AffectsMeasure之類的屬性不適用於這些屬性。如果您對附加屬性的元數據感興趣,則應該使用RegisterAttached。

有關詳細信息,請參閱我的回答類似的問題:Difference between Attached and non-Attached Dependency Properties in Silverlight