How can I have just the top corners rounded for a WPF rectangle?
I created a border and set the CornerRadius
property and inside the border I\'ve added my
Set the RadiusX and RadiusY properties on the rectangle, this will give it rounded corners
Good example how its possible to do OnRender with DrawingContext:
/// <summary>
/// Draws a rounded rectangle with four individual corner radius
/// </summary>
public static void DrawRoundedRectangle(this DrawingContext dc, Brush brush,
Pen pen, Rect rect, CornerRadius cornerRadius)
{
var geometry = new StreamGeometry();
using (var context = geometry.Open())
{
bool isStroked = pen != null;
const bool isSmoothJoin = true;
context.BeginFigure(rect.TopLeft + new Vector(0, cornerRadius.TopLeft), brush != null, true);
context.ArcTo(new Point(rect.TopLeft.X + cornerRadius.TopLeft, rect.TopLeft.Y),
new Size(cornerRadius.TopLeft, cornerRadius.TopLeft),
90, false, SweepDirection.Clockwise, isStroked, isSmoothJoin);
context.LineTo(rect.TopRight - new Vector(cornerRadius.TopRight, 0), isStroked, isSmoothJoin);
context.ArcTo(new Point(rect.TopRight.X, rect.TopRight.Y + cornerRadius.TopRight),
new Size(cornerRadius.TopRight, cornerRadius.TopRight),
90, false, SweepDirection.Clockwise, isStroked, isSmoothJoin);
context.LineTo(rect.BottomRight - new Vector(0, cornerRadius.BottomRight), isStroked, isSmoothJoin);
context.ArcTo(new Point(rect.BottomRight.X - cornerRadius.BottomRight, rect.BottomRight.Y),
new Size(cornerRadius.BottomRight, cornerRadius.BottomRight),
90, false, SweepDirection.Clockwise, isStroked, isSmoothJoin);
context.LineTo(rect.BottomLeft + new Vector(cornerRadius.BottomLeft, 0), isStroked, isSmoothJoin);
context.ArcTo(new Point(rect.BottomLeft.X, rect.BottomLeft.Y - cornerRadius.BottomLeft),
new Size(cornerRadius.BottomLeft, cornerRadius.BottomLeft),
90, false, SweepDirection.Clockwise, isStroked, isSmoothJoin);
context.Close();
}
dc.DrawGeometry(brush, pen, geometry);
}
Information from: http://wpftutorial.net/DrawRoundedRectangle.html
This one will work even with Rectangle (or anything else) inside it:
<Border>
<Border.OpacityMask>
<VisualBrush>
<VisualBrush.Visual>
<Border CornerRadius="5" Height="100" Width="100" Background="White"/>
</VisualBrush.Visual>
</VisualBrush>
</Border.OpacityMask>
// put your rounded content here
</Border>
You will have to play with Height and Width if you do not have exact size of content.
The problem you've got is that the rectangle is "overflowing" the rounded corners of your border.
A rectangle can't have individually rounded corners, so if you just put the background colour on the border and remove the rectangle:
<Border BorderThickness="1" Grid.Row="0" Grid.ColumnSpan="2"
CornerRadius="50,50,0,0" BorderBrush="Black" Background="#FF5A9AE0">
</Border>
You'll get your desired effect.