我试图从helix控件生成屏幕截图,但只在代码后面生成-为什么不起作用?什么东西不见了?
private void generate() {
ModelImporter importer = new ModelImporter();
Model3D model = importer.Load(@"c:testtest.obj");
Model3DGroup group = new Model3DGroup();
group.Children.Add(model);
ModelVisual3D myModelVisual3D = new ModelVisual3D();
myModelVisual3D.Content = group;
HelixViewport3D viewer = new HelixViewport3D();
viewer.Children.Add(myModelVisual3D);
Dispatcher.BeginInvoke(new Action(() =>
{
RenderTargetBitmap bmp = new RenderTargetBitmap(1024, 768, 96, 96, PixelFormats.Pbgra32);
bmp.Render(viewer);
PngBitmapEncoder png = new PngBitmapEncoder();
BitmapFrame frame = BitmapFrame.Create(bmp);
png.Frames.Add(frame);
using (Stream stm = File.Create(@"c:testtest.png"))
{
png.Save(stm);
} }
), DispatcherPriority.ContextIdle, null);
}
编辑:
没有例外-什么都没有-代码接缝可以工作,但PNG是空的。如果我将HelixViewport3D viewer
与XAML中的控件交换,则生成PNG是正常的。在代码呈现中定义的HelixViewport3D不起作用,PNG为空-大小正常-它是PNG,但没有内容-当我显示它时是透明的。在这个测试中,.obj文件没有什么特别之处——当我使用XAML定义的HelixViewport3D时——一切都很好。
我知道有点晚了,但找到一个令人满意的解决方案对我来说也不容易。
我看到的主要原因是您没有将视口附加到窗口。如果你和我一样根本不想看到任何窗口,有两种解决方案:
- 破解解决方案
- 将视口放在窗口中
- 将窗口样式设置为以下内容:
<Style x:Key="EdgeToEdgeWindowStyle" TargetType="Window">
<Setter Property="WindowStyle" Value="None" />
<Setter Property="AllowsTransparency" Value="True" />
<Setter Property="Left" Value="-10000" />
<Setter Property="Top" Value="-10000" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Window">
<AdornerDecorator>
<ContentPresenter />
</AdornerDecorator>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
- 清洁溶液按以下方式使用类HostVisual
this.hostVisual = new HostVisual();
this.visualTargetPS = new VisualTargetPresentationSource(hostVisual);
this.renderTargetBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
this.visualTargetPS.RootVisual = this.viewport;
不会有任何渲染循环,但可以手动触发调用this.viewport.InvalidateRender();
的渲染然后,每当你想保存渲染时,只需调用以下命令:
this.renderTargetBitmap.Render(this.viewport);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
using (var stream = new FileStream(this.currentJob.ThumbnailPath, FileMode.Create))
{
encoder.Save(stream);
}