天天看點

[UWP]附加屬性1:概述1. 什麼是附加屬性(attached property )2. 附加屬性有什麼作用3. 附加屬性的使用4. 完整的自定義附加屬性

附加屬性依賴屬性的一種特殊形式,常見的Grid.Row,Canvas.Left都是附加屬性。

附加屬性的簡單定義如上述代碼所示。可以看出和依賴屬性不同的地方在于沒有作為屬性包裝器的Setter和Getter,而多了兩個靜态函數GetXXX和SetXXX。并且注冊辨別符使用DependencyProperty.RegisterAttached而不是DependencyProperty.Register。

和依賴屬性不同的地方在于,依賴屬性是依賴對象本身的屬性,附加屬性是附加在其他對象身上的屬性,通俗來說就是在别的對象内插入自己的屬性。上面提到的Grid.Row,就是Grid将Row屬性附加到沒有Row屬性的其它類中,以便進行布局。

附加實行的使用方式和依賴屬性十分相似。

在XAML中使用附加屬性:

在C#代碼中使用附加屬性:

以上代碼為一個相對完整的自定義附加屬性,自定義附加屬性的步驟如下

使用 DependencyProperty.RegisterAttached注冊附加屬性辨別符,标示符的名稱必須是PropertyName+"Property",如這個例子中的"LeftProperty"。在PropertyMetadata中指定屬性預設值。

實作靜态的屬性通路器函數,名稱必須是GetPropertyName 和SetPropertyName,如例子中的public static double GetLeft(DependencyObject obj)和public static void SetLeft(DependencyObject obj, double value)。

如果需要監視屬性值變更,可以在PropertyMetadata中定義一個PropertyChangedCallback方法,一遍命名方式為OnPropertyNameChanged,如上述例子中的private static void OnLeftChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)。

注意: 屬性通路器中不要有多餘的代碼,理由參考依賴屬性。

VisualStudio自帶附加屬性的代碼段是propa,生成代碼如下:

要生成上述例子的完整附加屬性代碼,可使用自定義的代碼段,快捷鍵是ap: