web-dev-qa-db-ja.com

WPFコントロールのスクリーンショットを撮る方法は?

BingマップのWPFコントロールを使用してWPFアプリケーションを作成しました。 Bingマップコントロールのみのスクリーンショットを作成したいと思います。

このコードを使用してスクリーンショットを作成します:

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

私の問題:

WidthHeightは不良(偽の値)のようです。作成されたスクリーンショットは、不適切な座標を使用しているようです。

私のスクリーンショット:

My screenshot

私が期待するもの:

Desired screenshot

なぜこの結果が得られるのですか?リリースモードで試してみましたが、Visual Studioなしでは結果は同じです。

25

スクリーンショットは、画面のショットです...画面上のすべて。必要なのは、単一のUIElementから画像を保存することです。 RenderTargetBitmap.Renderメソッド 。このメソッドはVisual入力パラメーターを取りますが、幸いなことに、これはすべてのUIElementsの基本クラスの1つです。 .pngファイルを保存したい場合、これを行うことができます。

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