从 Helix Toolkit 保存图像

Saving an image from Helix Tookit

C#、WPF、Helix Toolkit. I am trying to save an image from a HelixViewport3D viewport (as described here),但仍有问题。

预期方法: 将图像渲染到视口并使用 Viewport3DHelper.SaveBitmap() 或类似方法简单保存。

Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);

问题:它运行但捕获的图像是空白的。我最好的猜测是 Helix Toolkit 正在异步渲染(?)在我保存它时没有图像可供抓取。

可能的解决方法 1:渲染完成后响应事件。

问题:没有合适的事件可以订阅。

可能的解决方法 2: 添加在线延迟以允许图像在保存之前呈现。 (笨拙且不可靠,但将是朝着正确方向迈出的一步)。

Thread.Sleep(2000);
Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);

问题: 在我的代码执行完成之前,图像不会显示。如果我添加 10 秒的延迟,我只会得到额外 10 秒的空白屏幕。

可能的解决方法 3: 添加一个计时器以便渲染图像,然后我可以从计时器经过事件中保存图像。

System.Timers.Timer timer = new System.Timers.Timer();
...
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Interval = 2000; // two seconds
timer.Start();
....
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
    Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);
}

问题在于:虽然图像已成功渲染并且可以拍摄,但计时器 运行 在不同的线程中,我无法引用来自事件处理程序的 HelixPlot 控件。我得到:

System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it.'

可能的解决方法 4: 运行 UI 线程中的计时器使用 Timer.SynchronizingObject

问题所在:在 WPF 中似乎无法做到这一点 easily/simply。我可以做到 with a lot of additional code,目前这可能是我最好的选择,但由于冗长和缺乏稳健性,它似乎非常次优。

难道没有一些相当简单的方法来实现我想要做的事情吗?

问题的根源似乎是在调用方法完成执行之前图像不会渲染到视口。我真的不明白这是为什么。

编辑:我在另一个论坛上得知 Helix Toolkit 正在 WPF 复合渲染线程上渲染。然而,经过一些谷歌搜索后,我仍然none更清楚如何等待渲染完成。

我在这里得到了答案:

似乎没有可用的完成事件,所以我能找到的唯一解决方法是使用 async.