Подтвердить что ты не робот

Как сделать снимок экрана с помощью элемента управления WPF?

Я создал приложение WPF, используя BIN-карты 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();

Моя проблема:

Width и Height оказываются плохими (ложные значения). Созданный снимок экрана использует плохие координаты.

Мой снимок экрана:

My screenshot

Что я ожидаю:

Desired screenshot

Почему я получаю этот результат? Я попытался в режиме Release, и без Visual Studio результат будет таким же.

4b9b3361

Ответ 1

Снимок экрана - это изображение экрана... все на экране. Вы хотите сохранить изображение из одного UIElement, и вы можете сделать это с помощью метода RenderTargetBitmap.Render. Этот метод принимает входной параметр Visual и, к счастью, это один из базовых классов для всех UIElement s. Предположим, что вы хотите сохранить файл .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);
}