Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to take a screenshot of a WPF control?

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.

like image 408
Walter Fabio Simoni Avatar asked Jun 28 '14 11:06

Walter Fabio Simoni


1 Answers

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); } 
like image 99
Sheridan Avatar answered Sep 18 '22 10:09

Sheridan