3

I'm using a third party control, and I would like to create a bitmap from the control (either to put on the clipboard or save to a png).

I have tried using a RenderBitmapTarget, but it will only copy the control as it is rendered on the screen (my grid is bigger than the screen).

My RenderBitmapTarget code looks like this:

RenderTargetBitmap rtb = new RenderTargetBitmap((int)control.ActualWidth, (int)control.ActualHeight, 96, 96, PixelFormats.Pbgra32);
rtb.Render(control);
PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(rtb));
MemoryStream stream = new MemoryStream();
png.Save(stream);
Image image = Image.FromStream(stream);

I've tried specifying a larger size (both in the RenderTargetBitmap constructor, and specifying new width/height for the control, but both just yielded the same image on a larger canvas.

Any thoughts?

David Hope
  • 2,216
  • 16
  • 32
  • Did you try this trick technique? http://stackoverflow.com/questions/5189139/how-to-render-a-wpf-usercontrol-to-a-bitmap-without-creating-a-window – kanchirk Jun 05 '15 at 15:01
  • 1
    Similar...what I ended up with is setting the controls height and width to double.NaN (which is "Auto") calling it's UpdateLayout function, then rendering to the RenderTargetBitmap. I'll post the solution when I'm permitted to. – David Hope Jun 05 '15 at 18:32
  • Thanks for posting the solution. – kanchirk Jun 05 '15 at 19:02

1 Answers1

3

Here is what I ended up with...

        tempWidth = myControl.ActualWidth;
        tempHeight = myControl.ActualHeight;

        myControl.Width = double.NaN;
        myControl.Height = double.NaN;

        myControl.UpdateLayout();

        RenderTargetBitmap rtb = new RenderTargetBitmap((int)myControl.ActualWidth, (int)myControl.ActualHeight, 96, 96, PixelFormats.Pbgra32);

        rtb.Render(myControl);

        PngBitmapEncoder pbe = new PngBitmapEncoder();
        pbe.Frames.Add(BitmapFrame.Create(rtb));
        MemoryStream stream = new MemoryStream();
        pbe.Save(stream);
        image = (System.Drawing.Bitmap)System.Drawing.Image.FromStream(stream);

        CEGrid.Width = tempWidth;
        CEGrid.Height = tempHeight;
David Hope
  • 2,216
  • 16
  • 32