API de composition UWP: coins arrondis?
Nov 19 2020
J'ai du mal à comprendre pour créer des coins arrondis de contenu à l'aide de l'API Composition. C'est là que j'en suis, toute aide serait très appréciée:
void CreateRoundedCorners(Vector2 cornerRadius, CompositionSurfaceBrush imageSourceBrush, SpriteVisual targetVisual)
{
CompositionRoundedRectangleGeometry roundedRectangle = _compositor.CreateRoundedRectangleGeometry();
roundedRectangle.Size = new Vector2(;
roundedRectangle.CornerRadius = cornerRadius;
CompositionSpriteShape spriteShape = _compositor.CreateSpriteShape(roundedRectangle);
spriteShape.FillBrush = _compositor.CreateColorBrush(Colors.Black);
spriteShape.CenterPoint = new Vector2(_imageSize.X / 2, _imageSize.Y / 2);
ShapeVisual spriteShapeVisual = _compositor.CreateShapeVisual();
spriteShapeVisual.Size = _imageSize;
spriteShapeVisual.Shapes.Add(spriteShape);
CompositionMaskBrush maskBrush = _compositor.CreateMaskBrush();
maskBrush.Source = imageSourceBrush;
maskBrush.Mask = null; // How do I get the rectangle shape in here?
targetVisual.Brush = maskBrush;
}
Réponses
1 SeanO'Neil Nov 19 2020 at 13:24
J'ai trouvé une solution. Création d'un CompositionVisualSurface, ajout du ShapeVisual et création d'un CompositionSurfaceBrush à partir de celui-ci à utiliser comme source de masque.
void CreateRoundedCorners(Vector2 cornerRadius, CompositionBrush imageSourceBrush, SpriteVisual targetVisual)
{
CompositionRoundedRectangleGeometry roundedRectangle =_compositor.CreateRoundedRectangleGeometry();
roundedRectangle.Size = _imageSize;
roundedRectangle.CornerRadius = cornerRadius;
CompositionSpriteShape spriteShape = _compositor.CreateSpriteShape(roundedRectangle);
spriteShape.FillBrush = _compositor.CreateColorBrush(Colors.Black);
spriteShape.CenterPoint = new Vector2(_imageSize.X / 2, _imageSize.Y / 2);
ShapeVisual spriteShapeVisual = _compositor.CreateShapeVisual();
spriteShapeVisual.BorderMode = CompositionBorderMode.Soft;
spriteShapeVisual.Size = _imageSize;
spriteShapeVisual.Shapes.Add(spriteShape);
CompositionVisualSurface surface = _compositor.CreateVisualSurface();
surface.SourceSize = _imageSize;
surface.SourceVisual = spriteShapeVisual;
CompositionMaskBrush maskBrush = _compositor.CreateMaskBrush();
maskBrush.Source = imageSourceBrush;
maskBrush.Mask = _compositor.CreateSurfaceBrush(surface);
targetVisual.Brush = maskBrush;
}
EDIT: Un masque peut également être obtenu à partir d'une forme mais uniquement s'il se trouve déjà dans l'arborescence visuelle:
Windows.UI.Xaml.Shapes.Shape rect = new Rectangle();
CompositionBrush mask = rect.GetAlphaMask();
NicoZhu-MSFT Nov 19 2020 at 12:45
API de composition UWP: coins arrondis?
Pour vos besoins, vous pouvez utiliser la SetElementChildVisualméthode pour ajouter le CompositionRoundedRectangleGeometry
à la page actuelle.
Par exemple:
private void Page_Loaded(object sender, RoutedEventArgs e)
{
var visual = ElementCompositionPreview.GetElementVisual(this);
var compositor = visual.Compositor;
CompositionRoundedRectangleGeometry roundedRectangle = compositor.CreateRoundedRectangleGeometry();
roundedRectangle.Size = new Vector2(200, 200);
roundedRectangle.CornerRadius = new Vector2(30,30);
CompositionSpriteShape spriteShape = compositor.CreateSpriteShape(roundedRectangle);
spriteShape.FillBrush = compositor.CreateColorBrush(Colors.Blue);
spriteShape.CenterPoint = new Vector2(100, 100);
ShapeVisual spriteShapeVisual = compositor.CreateShapeVisual();
spriteShapeVisual.Size = new Vector2(200, 200);
spriteShapeVisual.Shapes.Clear();
spriteShapeVisual.Shapes.Add(spriteShape);
ElementCompositionPreview.SetElementChildVisual(this, spriteShapeVisual);
}