WP7备注(29)(Attached Properties|CanvasClone)
2011-05-02 18:31 血糯米Otomii 阅读(222) 评论(0) 编辑 收藏 举报首先,Canvas是一个Attached Properties的代表控件,对于Canvas,四个坐标都是Attached Properties,所以进行Canvas的内置机制的Clone,可以让我们更好的了解
首先声明属性
public static readonly DependencyProperty LeftProperty = DependencyProperty.RegisterAttached("Left", typeof(double), typeof(CanvasClone), new PropertyMetadata(0.0, OnLeftOrTopPropertyChanged)); public static readonly DependencyProperty TopProperty = DependencyProperty.RegisterAttached("Top", typeof(double), typeof(CanvasClone), new PropertyMetadata(0.0, OnLeftOrTopPropertyChanged));
Get,Set
public static void SetLeft(DependencyObject obj, double value) { obj.SetValue(LeftProperty, value); } public static double GetLeft(DependencyObject obj) { return (double)obj.GetValue(LeftProperty); } public static void SetTop(DependencyObject obj, double value) { obj.SetValue(TopProperty, value); } public static double GetTop(DependencyObject obj) { return (double)obj.GetValue(TopProperty); }
重新安排所有子控件的位置:
static void OnLeftOrTopPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args) { CanvasClone parent = VisualTreeHelper.GetParent(obj) as CanvasClone; if (parent != null) parent.InvalidateArrange(); }
MeasureOverride:
protected override Size MeasureOverride(Size availableSize) { foreach (UIElement child in Children) child.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); return Size.Empty; }
ArrangeOverride:
protected override Size ArrangeOverride(Size finalSize) { foreach (UIElement child in Children) child.Arrange(new Rect( new Point(GetLeft(child), GetTop(child)), child.DesiredSize)); return base.ArrangeOverride(finalSize); }