【问题标题】:Create a screenshot of a WPF control in a background thread在后台线程中创建 WPF 控件的屏幕截图
【发布时间】:2015-03-13 15:40:24
【问题描述】:

我们需要在后台线程中创建 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 但没有成功(不完全理解该类的目的)。

【问题讨论】:

    标签: c# wpf multithreading


    【解决方案1】:

    有可能,您缺少的可能是控件的尺寸和排列:

        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);
            }
    
        }
    

    【讨论】:

    • 您的示例有效 - 但在我的代码中,我使用的是图像,但该图像不起作用:屏幕截图始终为白色。我从 Image 派生并覆盖了 OnRender 以查看是否调用了那个 - 确实是(调用堆栈从 Arrange() 调用开始)。
    • 对不起,这是我的错误 - 我加载的图像没有复制到输出目录,我认为它会从程序集本身加载(文件被标记为“资源”)。因此,无法加载图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多