5. 附加屬性實踐:自定義Canvas

附加屬性在UWP中是一個十分重要的組成部分,很多功能都依賴于附加屬性實現(xiàn),典型的例子是常用的Grid和Canvas。通常附加屬性有三個使用場景:插入屬性、觸發(fā)行為、當做緩存。可以參考以下提供的MyCanvas示例理解這三點。

5.1 插入屬性

這里實現(xiàn)的MyCanvas繼承自Panel,是一個十分簡單的類(作為示例并沒有十分嚴格的驗證等代碼,所以只有幾十行代碼),它實現(xiàn)了和Canvas類似的布局并且提供了Left和Right兩個附加屬性。使用方式如下:

<local:MyCanvas>
    <Rectangle local:MyCanvas.Left="50"
               local:MyCanvas.Top="50"
               Height="100"
               Width="100"
               Fill="Green" /></local:MyCanvas>

Panel最核心的代碼是ArrangeOverride,簡單來說,它負責定位Children中的所有元素。MyCanvas讀取子元素的定位信息MyCanvas.Left和MyCanvas.Top后對其進行定位,子元素自身并沒有這兩個屬性,只有通過附加屬性插入。

public static double GetLeft(DependencyObject obj){
    return (double)obj.GetValue(LeftProperty);}public static void SetLeft(DependencyObject obj, double value){
    obj.SetValue(LeftProperty, value);}public static readonly DependencyProperty LeftProperty =
    DependencyProperty.RegisterAttached("Left", typeof(double), typeof(MyCanvas), new PropertyMetadata(
        
		

網(wǎng)友評論