API Komposisi UWP: Sudut Bulat?
Nov 19 2020
Saya berjuang untuk mencari cara untuk membuat konten sudut membulat menggunakan API Komposisi. Di sinilah saya berada, bantuan apa pun akan sangat dihargai:
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;
}
Jawaban
1 SeanO'Neil Nov 19 2020 at 13:24
Saya telah menemukan solusinya. Membuat CompositionVisualSurface, menambahkan ShapeVisual padanya, dan membuat CompositionSurfaceBrush dari situ untuk digunakan sebagai sumber Mask.
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: Masker juga bisa diperoleh dari Bentuk tetapi hanya jika sudah ada di pohon visual:
Windows.UI.Xaml.Shapes.Shape rect = new Rectangle();
CompositionBrush mask = rect.GetAlphaMask();
NicoZhu-MSFT Nov 19 2020 at 12:45
API Komposisi UWP: Sudut Bulat?
Untuk kebutuhan Anda, Anda dapat menggunakan SetElementChildVisualmetode untuk menambahkan CompositionRoundedRectangleGeometryke halaman saat ini.
Sebagai contoh:
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);
}