Search code examples
c#wpfdrawingcontext

How to show dropshadow on drawingcontext tools


Actually i am using drawingContext.DrawRectangle method for drawing rectangle on canvas.. i want to add shadow effect on rectangle..

drawingContext.DrawRectangle(new SolidColorBrush(graphicsObjectFillColor),
                             new Pen(new SolidColorBrush(ObjectColor), ActualLineWidth),
                             Rectangle);

or i am using this to add drop shadow..

 DropShadowEffect effect = new DropShadowEffect();
 effect = new DropShadowEffect { Color = Colors.Black, Direction = -45, Opacity = 0.5, ShadowDepth = 4};
 this.Effect = effect;

the shadow is showing but add the time of draw all tool on image tha shodow is not shawing i am using

                    DrawingVisual vs = new DrawingVisual();
                    DrawingContext dc = vs.RenderOpen();

                    // Draw image
                    dc.DrawImage(image.Source, rect);

                    double scale = width / image.Source.Width;

                    // Keep old existing actual scale and set new actual scale.
                    double oldActualScale = drawingCanvas.ActualScale;

                    drawingCanvas.ActualScale = oldActualScale;

                    // Remove clip in the canvas - we set our own clip.
                    drawingCanvas.RemoveClip();

                    // Prepare drawing context to draw graphics
                    rect = new Rect(left, top, width, height);
                    dc.PushClip(new RectangleGeometry(rect));

                    double horizontalScale = Math.Abs((positionDrawingCanvas.X) - (positionImage.X));
                    double verticalScale = Math.Abs((positionDrawingCanvas.Y) - (positionImage.Y));

                    double difX = 0.0;
                    double difY = 0.0;
                    //if (horizontalScale != 0 && verticalScale != 0)
                    //{
                    //     //horizontalScale = Math.Abs((positionDrawingCanvas.X + Math.Abs((positionImage.X / sliderScale.Value - positionImage.X))) - (positionImage.X));
                    //     //verticalScale = Math.Abs((positionDrawingCanvas.Y + Math.Abs((positionImage.Y / sliderScale.Value - positionImage.Y))) - (positionImage.Y));
                    //    difX = (positionImage.X - positionImage.X / sliderScale.Value);
                    //    difY = (positionImage.Y - positionImage.Y / sliderScale.Value);
                    //}

                    dc.PushTransform(new TranslateTransform(difX + left - horizontalScale, difY+top - verticalScale));
                    dc.PushTransform(new ScaleTransform(1, 1));

                    // Ask canvas to draw overlays
                    drawingCanvas.Draw(dc);

                    // Restore old actual scale.
                    drawingCanvas.ActualScale = oldActualScale;

                    // Restore clip
                    drawingCanvas.RefreshClip();

                    dc.Pop();
                    dc.Pop();
                    dc.Pop();

                    dc.Close();
                    width = (Utilityhelper.GetDIPIndependentHorizontal(rect.Width));
                    height = (Utilityhelper.GetDIPIndependentVertical(rect.Height));

                    bmp = new RenderTargetBitmap((int)width, (int)(height), Utilityhelper.graphics.DpiX, Utilityhelper.graphics.DpiY, PixelFormats.Default);
                    //bmp = new RenderTargetBitmap((int)(scale * (rect.Width)), (int)(scale * (rect.Height)), scale * 96, scale * 96, PixelFormats.Default);
                    bmp.Render(vs);
                    sliderScale.Value = oldScale;
                    //imageBackground.Stretch = Stretch.Uniform;
                    //drawingCanvas.Width = (Utilityhelper.GetDIPDependentHorizontal(drawingCanvas.Width));
                    //drawingCanvas.Height = (Utilityhelper.GetDIPDependentVertical(drawingCanvas.Height));
                    return bmp;

Solution

  • You have to just change your render method

    RenderTargetBitmap bmp = new RenderTargetBitmap((int)width, (int)(height), DpiX, DpiY, PixelFormats.Default);
    BitmapSource source = null;
    
    if (bmp != null)
    {
        bmp.Render(image);
        bmp.Render(drawingCanvas);
        source = bmp;
    }