protected override Geometry GetOrCreateBoxGeometry(Size renderSize) { var rect = new Rect(new Point(0, 0), renderSize); this.SetCurrentValue(RectProperty, rect); if (rect.Width <= 0 || rect.Height <= 0) { return Geometry.Empty; } if (this.CornerRadius.IsAllEqual()) { // using TopLeft here as we have already checked that they are equal if (this.BoxGeometry is RectangleGeometry) { return this.BoxGeometry; } var geometry = new RectangleGeometry(); geometry.Bind(RectangleGeometry.RectProperty) .OneWayTo(this, RectProperty); geometry.Bind(RectangleGeometry.RadiusXProperty) .OneWayTo(this, CornerRadiusProperty, CornerRadiusTopLeftConverter.Default); geometry.Bind(RectangleGeometry.RadiusYProperty) .OneWayTo(this, CornerRadiusProperty, CornerRadiusTopLeftConverter.Default); return geometry; } else { var geometry = new StreamGeometry(); using (var context = geometry.Open()) { var cr = this.AdjustedCornerRadius(); var p = cr.TopLeft > 0 ? new Point(cr.TopLeft + this.StrokeThickness / 2, this.StrokeThickness / 2) : new Point(this.StrokeThickness / 2, this.StrokeThickness / 2); context.BeginFigure(p, true, true); p = p.WithOffset(rect.Width - cr.TopLeft - cr.TopRight, 0); context.LineTo(p, true, true); p = context.DrawCorner(p, cr.TopRight, cr.TopRight); p = p.WithOffset(0, rect.Height - cr.TopRight - cr.BottomRight); context.LineTo(p, true, true); p = context.DrawCorner(p, -cr.BottomRight, cr.BottomRight); p = p.WithOffset(-rect.Width + cr.BottomRight + cr.BottomLeft, 0); context.LineTo(p, true, true); p = context.DrawCorner(p, -cr.BottomLeft, -cr.BottomLeft); p = p.WithOffset(0, -rect.Height + cr.TopLeft + cr.BottomLeft); context.LineTo(p, true, true); context.DrawCorner(p, cr.TopLeft, -cr.TopLeft); } geometry.Freeze(); return geometry; } }