Wie kann man die ColorShadow-Kompositionssteuerung kreisförmig gestalten?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Wie kann man die ColorShadow-Kompositionssteuerung kreisförmig gestalten?

Post by Anonymous »

Ich verwende das ColorShadow-Steuerelement aus dem CompositionProToolkit in einem WinUI/UWP-Projekt. Ich habe es auf WinUI portiert, indem ich Namespaces und Window.Current... durch CompositionTarget.GetCompositionForCurrentThread ersetzt habe. Derzeit ist die Schattenform rechteckig.
Image

Ich möchte, dass der Schatten kreisförmig ist und dem darüber platzierten kreisförmigen Bild entspricht.
Ich kann das Bild mit diesem Code kreisförmig machen:

Code: Select all

var imageBrush = await MakeCircularAsync(_imageSurface, _imageVisual.Size);

_imageVisual.Brush = imageBrush;

_colorShadowBrush.SetSourceParameter("source", imageBrush.Source);

private async Task MakeCircularAsync(IImageSurface imageSurface, Vector2 targetSize)

{

if (imageSurface == null)

return null;

if (_compositor == null)

{

_compositor = CompositionTarget.GetCompositorForCurrentThread();

_generator = _compositor.CreateCompositionGenerator();

}

float diameter = Math.Min(targetSize.X, targetSize.Y);

var radius = diameter / 2f;

var ellipse = CanvasGeometry.CreateCircle(

_generator.Device,

new Vector2(targetSize.X / 2f, targetSize.Y / 2f),

radius);

var maskSurface = _generator.CreateMaskSurface(targetSize.ToSize(), null);

maskSurface.Redraw(targetSize.ToSize(), ellipse);

var maskBrush = _compositor.CreateSurfaceBrush(maskSurface);

var sourceBrush = _compositor.CreateSurfaceBrush(imageSurface);

sourceBrush.Stretch = CompositionStretch.Fill;

var circularBrush = _compositor.CreateMaskBrush();

circularBrush.Source = sourceBrush;

circularBrush.Mask = maskBrush;

return circularBrush;

}
Das ist das Ergebnis:
Image

Jetzt muss ich den Schatten kreisförmig machen. Ich habe den folgenden Code verwendet:
Wenn ich verwende:

Code: Select all

_colorShadowBrush.SetSourceParameter("mask", imageBrush.Mask);
Oder wenn ich Folgendes verwende, erhalte ich das gleiche Ergebnis.

Code: Select all

UpdateColorShadowMask(_colorShadowVisual.Size);

private void UpdateColorShadowMask(Vector2 shadowSize)

{

float diameter = Math.Min(shadowSize.X, shadowSize.Y);

var radius = diameter / 2f;

var circle = CanvasGeometry.CreateCircle(

_generator.Device,

new Vector2(shadowSize.X / 2f, shadowSize.Y / 2f),

radius - 10);

if (_colorShadowMaskSurface == null)

_colorShadowMaskSurface = _generator.CreateMaskSurface(shadowSize.ToSize(), null);

_colorShadowMaskSurface.Redraw(shadowSize.ToSize(), circle);

var maskBrush = _compositor.CreateSurfaceBrush(_colorShadowMaskSurface);

_colorShadowBrush.SetSourceParameter("mask", maskBrush);

}
Und das ist das Ergebnis:
Image

Wie Sie sehen können, gibt es einen verschwommenen Ring anstelle einer sanft leuchtenden Schattenfarbe!
Wie kann ich also das erste Bild erreichen, aber mit einem kreisförmigen Schatten?
Den vollständigen Quellcode finden Sie hier und hier. Ich komme sowohl mit UWP- als auch mit WinUI-Code zurecht, es spielt also keine Rolle.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post