5. 附加屬性實(shí)踐:自定義Canvas
附加屬性在UWP中是一個(gè)十分重要的組成部分,很多功能都依賴于附加屬性實(shí)現(xiàn),典型的例子是常用的Grid和Canvas。通常附加屬性有三個(gè)使用場(chǎng)景:插入屬性、觸發(fā)行為、當(dāng)做緩存??梢詤⒖家韵绿峁┑腗yCanvas示例理解這三點(diǎn)。
5.1 插入屬性
這里實(shí)現(xiàn)的MyCanvas繼承自Panel,是一個(gè)十分簡(jiǎn)單的類(作為示例并沒有十分嚴(yán)格的驗(yàn)證等代碼,所以只有幾十行代碼),它實(shí)現(xiàn)了和Canvas類似的布局并且提供了Left和Right兩個(gè)附加屬性。使用方式如下:
<local:MyCanvas> <Rectangle local:MyCanvas.Left="50" local:MyCanvas.Top="50" Height="100" Width="100" Fill="Green" /></local:MyCanvas>
Panel最核心的代碼是ArrangeOverride,簡(jiǎn)單來(lái)說(shuō),它負(fù)責(zé)定位Children中的所有元素。MyCanvas讀取子元素的定位信息MyCanvas.Left和MyCanvas.Top后對(duì)其進(jìn)行定位,子元素自身并沒有這兩個(gè)屬性,只有通過附加屬性插入。
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(