/// <summary> /// ClipBorder computes the position of its single child and applies its child's alignments to the child. /// /// </summary> /// <param name="finalSize">The size reserved for this element by the parent</param> /// <returns>The actual ink area of the element, typically the same as finalSize</returns> protected override Size ArrangeOverride(Size finalSize) { var borders = BorderThickness; var boundRect = new Rect(finalSize); var innerRect = boundRect.Deflate(borders); var corners = CornerRadius; var padding = Padding; var childRect = innerRect.Deflate(padding); // calculate border rendering geometry if (!boundRect.Width.IsZero() && !boundRect.Height.IsZero()) { var outerBorderInfo = new BorderInfo(corners, borders, new Thickness(), true); var borderGeometry = new StreamGeometry(); using (var ctx = borderGeometry.Open()) { GenerateGeometry(ctx, boundRect, outerBorderInfo); } // Freeze the geometry for better perfomance borderGeometry.Freeze(); _borderGeometryCache = borderGeometry; } else { _borderGeometryCache = null; } // calculate background rendering geometry if (!innerRect.Width.IsZero() && !innerRect.Height.IsZero()) { var innerBorderInfo = new BorderInfo(corners, borders, new Thickness(), false); var backgroundGeometry = new StreamGeometry(); using (var ctx = backgroundGeometry.Open()) { GenerateGeometry(ctx, innerRect, innerBorderInfo); } // Freeze the geometry for better perfomance backgroundGeometry.Freeze(); _backgroundGeometryCache = backgroundGeometry; } else { _backgroundGeometryCache = null; } // Arrange the Child and set its clip var child = Child; if (child != null) { child.Arrange(childRect); // Calculate the Clipping Geometry var clipGeometry = new StreamGeometry(); var childBorderInfo = new BorderInfo(corners, borders, padding, false); using (var ctx = clipGeometry.Open()) { GenerateGeometry(ctx, new Rect(0, 0, childRect.Width, childRect.Height), childBorderInfo); } // Freeze the geometry for better perfomance clipGeometry.Freeze(); // Apply the clip to the Child child.Clip = clipGeometry; } return finalSize; }