public class CusCanvas : Canvas { // Methods protected override Size ArrangeOverride(Size arrangeSize) { foreach (UIElement element in base.InternalChildren) { if (element == null) { continue; } double x = 0.0; double y = 0.0; double left = GetLeft(element); if (!Double.IsNaN(left)) { x = left; } else { double right = GetRight(element); if (!Double.IsNaN(right)) { x = (arrangeSize.Width - element.DesiredSize.Width) - right; } } double top = GetTop(element); if (!Double.IsNaN(top)) { y = top; } else { double bottom = GetBottom(element); if (!Double.IsNaN(bottom)) { y = (arrangeSize.Height - element.DesiredSize.Height) - bottom; } } element.Arrange(new Rect(new Point(x, y), element.DesiredSize)); } return arrangeSize; }
protected override Size MeasureOverride(Size constraint) { Size availableSize = new Size(double.PositiveInfinity, double.PositiveInfinity); foreach (UIElement element in base.InternalChildren) { if (element != null) { element.Measure(availableSize); } } return new Size(); }
private static void OnPositioningChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { UIElement reference = d as UIElement; if (reference != null) { Canvas parent = VisualTreeHelper.GetParent(reference) as Canvas; if (parent != null) { parent.InvalidateArrange(); } } }
}