需要把WPF的一个窗口所展示的内容保存为一张图片存放到本地,要求窗口无论是显示还是隐藏都需要获取到内容进行保存。我的WPF相关内容是放在Winfrom的ElementHost控件中,通过ElementHost的Paint事件,拿到句柄保存的图片的空白的。
功能核心代码如下:
System.Windows.Forms.Integration.ElementHost.Paint += new System.Windows.Forms.PaintEventHandler(this.ContentViewControl_OnPaint);
private void ContentViewControl_OnPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
Bitmap bit = new Bitmap(800, 600);
e.Graphics.DrawImage(bit, new System.Drawing.Point(0, 0));
bit.Save("D:\1.png");
}
这可能跟wpf刷新机制有关,wpf在winform中就会存在这样的问题,最小化窗口截图没有图像,可以确定的是显示窗口时可以截图,
如果能接受的话就先form.show在进行screenshot然后form.hide,这样效果会有一个黑影一闪而过,
如果你还有其他窗口显示的话,可以设置其他窗口topmost为true,在显示窗口截图然后隐藏,此时现实的窗口会被他起窗口遮挡,这样能解决黑影一闪而过的问题,别忘了最后再设置topmost为false
可以尝试使用 win32 api .
由于Winfrom和WPF窗口刷新机制不同,通过Winfrom的窗口句柄无法获取以WPF绘制的图像内容,目前采用WPF项目自行截图保存,在调用其图片在其他项目中进行显示。
using (System.IO.FileStream fs = new System.IO.FileStream(file, System.IO.FileMode.Create,
FileAccess.Write, FileShare.ReadWrite))
{
System.Windows.Media.Imaging.RenderTargetBitmap img =
new System.Windows.Media.Imaging.RenderTargetBitmap((int)ui.ActualWidth,
(int)ui.ActualHeight, 96d, 96d, System.Windows.Media.PixelFormats.Pbgra32);
img.Render(ui);
System.Windows.Media.Imaging.JpegBitmapEncoder encoder =
new System.Windows.Media.Imaging.JpegBitmapEncoder();
encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(img));
encoder.Save(fs);
fs.Close();
}
该实现方式不是特别友好,存在许多不足,只是为了满足项目需求,望大佬们谅解。