WPF中的屏幕截图不包含所有UI更新

时间:2015-11-13 10:58:49

标签: c# wpf screenshot

我使用代码like this在WPF应用程序中进行屏幕捕获。简而言之:

var drawingvisual = new DrawingVisual();
using( DrawingContext context = drawingvisual.RenderOpen() )
{
  context.DrawRectangle( new VisualBrush( fooElement ), null, new Rect( fooElementSize ) );
  context.Close();
}
var r = new RenderTargetBitmap( ... );
r.Render( drawingvisual );
SaveBitmapToFile( r, .... );

例如,当鼠标单击调用时,原理工作得很好,但是我在以编程方式调用时遇到了问题。流程是:

  • 后台线程想要更​​新UI,并使用Application.Current.Dispatcher.Invoke
  • 进行更新
  • 后台线程执行其他操作(这只需要一些mSec)
  • 后台线程再次使用Application.Current.Dispatcher.Invoke
  • 向刚刚更新的UI的相同部分发出命令

这在我的开发计算机上运行正常,但在某些用户的计算机上,这会导致保存的图像不包含所有更新。因此,例如当TextBlock具有正在运行的文本时#39;并且上面的第一步将其设置为空字符串,屏幕截图仍显示“正在运行”。对于TextBlock。或者,如果第一步是使用一堆元素填充Canvas,则屏幕截图不会包含它们。当渲染元素隐藏在其他窗口等后面时,情况会变得更糟。

考虑到这一点,似乎关键问题在于WPF使用单独的渲染线程,并且只有当它完成了它的工作时,UI才真正被绘制并准备好捕获。搜索产生some hits甚至一些解决方案'围绕着

Application.Current.Dispatcher.BeginInvoke( DispatcherPriority.ApplicationIdle,
  new Action( () => { } ) ).Wait();

但据我所知,这只是等待UI线程空闲,这不能保证渲染线程已经完成更新我要捕获的UI部分?在任何情况下,在捕获代码之前在后台线程中插入此行没有任何区别。有时似乎工作的只是阻塞后台线程100毫秒左右,然后进行捕获。这只是解决方案的一半。

我正在做什么有什么问题,有什么可以改变以确保捕获的图像始终包含UI的最新更新?

0 个答案:

没有答案