Skip to content

Demonstrates how to apply drop shadows to Xaml elements

Property ​

Name
BlurRadius
Color
OffsetX
OffsetY
OffsetZ
ShadowOpacity
Content
Mask
IsRounded
IsBreathing
UseCornerRadius
CornerRadius

Methods ​

Name
GetDropShadow
StartBreath
StopBreath

Example ​

xml
 <dev:CompositionShadow BlurRadius="10" ShadowOpacity="0.7" Color="Yellow">
    <TextBlock FontSize="30"
                FontWeight="SemiBold"
                TextWrapping="Wrap">
        Here’s a custom control that allows you to apply DropShadows through Markup on XAML Text, Images, or Shapes
    </TextBlock>
</dev:CompositionShadow>

Using Mask ​

Example 1 ​

xml
<dev:CompositionShadow x:Name="RenderShadow"
                       Width="100"
                       Height="100"
                       HorizontalAlignment="Left"
                       VerticalAlignment="Top"
                       Color="Red"/>
cs
var compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

float width = (float)RenderShadow.ActualWidth;
float height = (float)RenderShadow.ActualHeight;
float radius = MathF.Min(width, height) / 2f;

var ellipse = compositor.CreateEllipseGeometry();
ellipse.Center = new Vector2(width / 2f, height / 2f);
ellipse.Radius = new Vector2(radius, radius);

var shape = compositor.CreateSpriteShape(ellipse);
shape.FillBrush = compositor.CreateColorBrush(Colors.White);

var shapeVisual = compositor.CreateShapeVisual();
shapeVisual.Size = new Vector2(width, height);
shapeVisual.Shapes.Add(shape);

var visualSurface = compositor.CreateVisualSurface();
visualSurface.SourceVisual = shapeVisual;
visualSurface.SourceSize = new Vector2(width, height);

var maskBrush = compositor.CreateSurfaceBrush(visualSurface);

RenderShadow.Mask = maskBrush;

Example 2 ​

xml
<ToggleSwitch x:Name="TGMask" Header="Toggle Mask" Toggled="TGMask_Toggled" />

 <dev:CompositionShadow x:Name="RenderShadow" Width="200" Height="300" BlurRadius="10" ShadowOpacity="0.7" Color="Green">
    <dev:CompositionImage x:Name="ComImage" Source="ms-appx:///Assets/Others/Girl.jpg" />
</dev:CompositionShadow>
cs
private Compositor _compositor;
private ManagedSurface _imageMaskSurface;
private CompositionMaskBrush _maskBrush;
public CompositionShadowPage()
{
    InitializeComponent();
    Loaded += CompositionShadowPage_Loaded;
    Unloaded += CompositionShadowPage_Unloaded;
}

private void CompositionShadowPage_Unloaded(object sender, RoutedEventArgs e)
{
    if (_imageMaskSurface != null)
    {
        _imageMaskSurface.Dispose();
    }
}

private void CompositionShadowPage_Loaded(object sender, RoutedEventArgs e)
{
    _compositor = ElementCompositionPreview.GetElementVisual(this).Compositor;

    _imageMaskSurface = ImageLoader.Instance.LoadCircle(200, Colors.White);

    CompositionSurfaceBrush source = ComImage.SurfaceBrush as CompositionSurfaceBrush;

    _maskBrush = _compositor.CreateMaskBrush();
    _maskBrush.Mask = _imageMaskSurface.Brush;
    _maskBrush.Source = source;
}

private void TGMask_Toggled(object sender, RoutedEventArgs e)
{
    if (TGMask.IsOn)
    {
        ComImage.Brush = _maskBrush;
        RenderShadow.Mask = _maskBrush.Mask;
    }
    else
    {
        ComImage.Brush = _maskBrush.Source;
        RenderShadow.Mask = null;
    }
}

CompositionShadow

Demo ​

you can run demo and see this feature.

Released under the MIT License.