How to take a screenshot of a WPF control?

25,911

A screenshot is a shot of the screen... everything on the screen. What you want is to save an image from a single UIElement and you can do that using the RenderTargetBitmap.Render Method. This method takes a Visual input parameter and luckily, that is one of the base classes for all UIElements. So assuming that you want to save a .png file, you could do this:

RenderTargetBitmap renderTargetBitmap = 
    new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
renderTargetBitmap.Render(yourMapControl); 
PngBitmapEncoder pngImage = new PngBitmapEncoder();
pngImage.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
using (Stream fileStream = File.Create(filePath))
{
    pngImage.Save(fileStream);
}
Share:
25,911
Walter Fabio Simoni
Author by

Walter Fabio Simoni

Updated on April 24, 2021

Comments

  • Walter Fabio Simoni
    Walter Fabio Simoni about 3 years

    I created a WPF application using the Bing maps WPF control. I would like to be able to screenshot only the Bing maps control.

    Is use this code to make the screenshot:

    // Store the size of the map control
    int Width = (int)MyMap.RenderSize.Width;
    int Height = (int)MyMap.RenderSize.Height;
    System.Windows.Point relativePoint = MyMap.TransformToAncestor(Application.Current.MainWindow).Transform(new System.Windows.Point(0, 0));
    int X = (int)relativePoint.X;
    int Y = (int)relativePoint.Y;
    
    Bitmap Screenshot = new Bitmap(Width, Height);
    Graphics G = Graphics.FromImage(Screenshot);
    // snip wanted area
    G.CopyFromScreen(X, Y, 0, 0, new System.Drawing.Size(Width, Height), CopyPixelOperation.SourceCopy);
    
    string fileName = "C:\\myCapture.bmp";
    System.IO.FileStream fs = System.IO.File.Open(fileName, System.IO.FileMode.OpenOrCreate);
    Screenshot.Save(fs, System.Drawing.Imaging.ImageFormat.Bmp);
    fs.Close();
    

    My problem:

    The Width and Height appear to be bad (false values). The screenshot produced appear to use bad coordinates.

    My screenshot:

    My screenshot

    What I expect:

    Desired screenshot

    Why do I get this result? I tried in Release mode, and without Visual Studio, result is the same.