API thành phần UWP: Góc tròn?
Nov 19 2020
Tôi đang đấu tranh để tìm ra cách tạo các góc tròn của nội dung bằng API thành phần. Đây là nơi tôi đang ở, mọi sự trợ giúp sẽ được đánh giá cao:
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;
}
Trả lời
1 SeanO'Neil Nov 19 2020 at 13:24
Tôi đã tìm ra một giải pháp. Tạo một CompositionVisualSurface, thêm ShapeVisual vào nó và tạo một CompositionSurfaceBrush từ đó để sử dụng làm nguồn Mặt nạ.
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;
}
CHỈNH SỬA: Mặt nạ cũng có thể được lấy từ Hình dạng nhưng chỉ khi nó đã có trong cây trực quan:
Windows.UI.Xaml.Shapes.Shape rect = new Rectangle();
CompositionBrush mask = rect.GetAlphaMask();
NicoZhu-MSFT Nov 19 2020 at 12:45
API thành phần UWP: Góc tròn?
Đối với yêu cầu của bạn, bạn có thể sử dụng SetElementChildVisualphương pháp để thêm CompositionRoundedRectangleGeometrytrang vào trang hiện tại.
Ví dụ:
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);
}