2015-03-13 45 views
1

我们需要在后台线程中创建WPF控件(例如,带有一些图片的画布),然后截取它们。控件不得显示。在后台线程中创建WPF控件的屏幕截图

我设法通过使它成为STA线程来创建线程上的控件。然后我使用这里的代码http://blogs.msdn.com/b/swick/archive/2007/12/02/rendering-ink-and-image-to-a-bitmap-using-wpf.aspx创建屏幕截图。

虽然这不起作用:控件的大小始终为0,因此会崩溃。即使我手动指定宽度和高度,它也不起作用,保存的图像始终为黑色。

这里是我的代码:

private void CreateScreenshotThread() 
{ 
    var image = CreateImage(); 
    TakeScreenshot(image , @"e:\1.bmp"); 
} 

我也试图UpdateLayout请()但没有成功。你有什么想法我可以如何执行控件的布局更新和呈现?我玩过PresentationSource但没有成功(不完全理解该课程的目的)。

回答

0

这是可能的,你缺少的位可能是测量和控制的安排:

public MainWindow() 
    { 
     InitializeComponent(); 

     var thread = new Thread(CreateScreenshot); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 
    } 

    private void CreateScreenshot() 
    { 
     Canvas c = new Canvas { Width = 100, Height = 100 }; 
     c.Children.Add(new Rectangle { Height = 100, Width = 100, Fill = new SolidColorBrush(Colors.Red) }); 

     var bitmap = new RenderTargetBitmap((int)c.Width, (int)c.Height, 120, 120, PixelFormats.Default); 
     c.Measure(new Size((int)c.Width, (int)c.Height)); 
     c.Arrange(new Rect(new Size((int)c.ActualWidth, (int)c.ActualHeight))); 
     bitmap.Render(c); 

     var png = new PngBitmapEncoder(); 
     png.Frames.Add(BitmapFrame.Create(bitmap)); 

     using (Stream stm = File.Create("c:\\temp\\test.png")) 
     { 
      png.Save(stm); 
     } 

    } 
+0

你的榜样作品 - 但在我的代码我使用的图像和一个不工作:屏幕截图始终是白色的。我从Image派生出来,并且覆盖了OnRender,看看是否有人被调用 - 事实上它是(callstack从Arrange()调用开始)。 – 2015-03-16 13:24:31

+0

对不起,这是我的错误 - 我加载的图像没有复制到输出目录,我认为它会从程序集本身加载(该文件被标记为“资源”)。因此,图像无法加载。 – 2015-03-16 13:57:42