web-dev-qa-db-fra.com

Comment faire une capture d'écran d'un contrôle WPF?

J'ai créé une application WPF à l'aide du contrôle WPF de Bing maps. Je voudrais pouvoir capturer uniquement le contrôle des cartes Bing.

Utilisez ce code pour faire la capture d'écran:

// 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();

Mon problème:

Width et Height semblent être mauvais (fausses valeurs). La capture d'écran produite semble utiliser de mauvaises coordonnées.

Ma capture d'écran:

My screenshot

Ce que j'attends:

Desired screenshot

Pourquoi est-ce que j'obtiens ce résultat? J'ai essayé en mode Release, et sans Visual Studio, le résultat est le même.

30

Une capture d'écran est une vue de l'écran ... tout sur l'écran. Ce que vous voulez, c'est enregistrer une image à partir d'un seul UIElement et vous pouvez le faire en utilisant RenderTargetBitmap.Render Méthode . Cette méthode prend un paramètre d'entrée Visual et heureusement, c'est l'une des classes de base pour tous les UIElements. En supposant donc que vous souhaitiez enregistrer un fichier .png, vous pouvez procéder comme suit:

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);
}
48
Sheridan