Comment puis-je avoir les coins supérieurs arrondis pour un rectangle WPF? J'ai créé une bordure et défini la propriété CornerRadius. À l'intérieur de la bordure, j'ai ajouté mon rectangle, mais cela ne fonctionne pas, le rectangle n'est pas arrondi.
<Border BorderThickness="1" Grid.Row="0" Grid.ColumnSpan="2" CornerRadius="50,50,0,0" BorderBrush="Black">
<Rectangle Fill="#FF5A9AE0" Grid.Row="0" Grid.ColumnSpan="2" Stretch="UniformToFill" ClipToBounds="True"/>
</Border>
Le problème que vous avez, c'est que le rectangle "déborde" des coins arrondis de votre bordure.
Un rectangle ne peut pas avoir de coins individuellement arrondis, donc si vous mettez simplement la couleur de fond sur la bordure et supprimez le rectangle:
<Border BorderThickness="1" Grid.Row="0" Grid.ColumnSpan="2"
CornerRadius="50,50,0,0" BorderBrush="Black" Background="#FF5A9AE0">
</Border>
Vous obtiendrez l'effet désiré.
Définissez les propriétés RadiusX et RadiusY sur le rectangle, cela lui donnera des coins arrondis
Bon exemple comment il est possible de faire OnRender avec 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);
}
Informations provenant de: http://wpftutorial.net/DrawRoundedRectangle.html
Celui-ci fonctionnera même avec Rectangle (ou autre chose) à l'intérieur:
<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>
Vous devrez jouer avec Height et Width si vous n'avez pas la taille exacte du contenu.