Как сделать композицию элемента управления ColorShadow круговой?C#

Место общения программистов C#
Ответить
Anonymous
 Как сделать композицию элемента управления ColorShadow круговой?

Сообщение Anonymous »

Я использую элемент управления ColorShadow из CompositionProToolkit в проекте WinUI/UWP. Я перенес его в WinUI, заменив пространства имен и Window.Current... на CompositionTarget.GetCompositionForCurrentThread. В настоящее время форма тени имеет прямоугольную форму.
Изображение

Я хочу, чтобы тень была круглой, соответствующей круглому изображению, помещенному поверх нее.
Я могу сделать изображение круглым, используя этот код:

Код: Выделить всё

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;

}
Вот результат:
Изображение

Теперь мне нужно сделать тень круглой. Я использовал следующий код:
Если я использую:

Код: Выделить всё

_colorShadowBrush.SetSourceParameter("mask", imageBrush.Mask);
Или, если я использую следующее, я получу тот же результат.

Код: Выделить всё

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);

}
И вот результат:
Изображение

Как видите, вместо мягкого свечения тени получается размытое кольцо!
Итак, как мне получить первое изображение, но с круглой тенью?
/>Полный исходный код можно найти здесь и здесь. Меня устраивает код UWP или WinUI, так что это не имеет значения.

Подробнее здесь: https://stackoverflow.com/questions/798 ... l-circular
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»