C# WPF RenderTargetBitmap与Viewport3D

C# WPF RenderTargetBitmap与Viewport3D,c#,wpf,xaml,rendertargetbitmap,C#,Wpf,Xaml,Rendertargetbitmap,我正在用XamlReader加载一个XamlUserControl,然后尝试将其转换为带有RenderTargetBitmap的图像 使用一个简单的用户控件可以很好地工作 但是如果我使用这个Viewport3D,它就不起作用了。创建图像时没有三维零件…: <Viewport3D> <ModelVisual3D> <ModelVisual3D.Content> <Geometr

我正在用XamlReader加载一个XamlUserControl,然后尝试将其转换为带有RenderTargetBitmap的图像

使用一个简单的用户控件可以很好地工作

但是如果我使用这个Viewport3D,它就不起作用了。创建图像时没有三维零件…:

    <Viewport3D>
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <GeometryModel3D>
                    <GeometryModel3D.Geometry>
                        <MeshGeometry3D
                            Positions="-0.5  0.5  -0.5,  0.5  0.5  -0.5,
                                       -0.5  0  0.5,  0.5  0  0.5"
                            TriangleIndices=" 0  2  1,  1  2  3"
                            TextureCoordinates="0 0, 1 0, 0 1, 1 1" />
                    </GeometryModel3D.Geometry>

                    <GeometryModel3D.Material>
                        <DiffuseMaterial>
                            <DiffuseMaterial.Brush>
                                <VisualBrush>
                                    <VisualBrush.Visual>
                                        <Button>Hi</Button>
                                    </VisualBrush.Visual>
                                </VisualBrush>
                            </DiffuseMaterial.Brush>
                        </DiffuseMaterial>                              
                    </GeometryModel3D.Material>

                    <!-- Non-Affine Matrix Transform. -->
                    <GeometryModel3D.Transform>
                        <MatrixTransform3D>
                        </MatrixTransform3D>
                    </GeometryModel3D.Transform>

                </GeometryModel3D>
            </ModelVisual3D.Content>
        </ModelVisual3D>

        <!-- Light sources. -->
        <ModelVisual3D>
            <ModelVisual3D.Content>
                <Model3DGroup>
                    <AmbientLight Color="#404040" />
                    <DirectionalLight Color="#C0C0C0" Direction="0 -2 -1" />
                </Model3DGroup>
            </ModelVisual3D.Content>
        </ModelVisual3D>

        <!-- Camera. -->
        <Viewport3D.Camera>
            <PerspectiveCamera Position="0 0.2 1"
                               LookDirection="0 0 -1.5"
                               UpDirection="0 1 0"
                               FieldOfView="100">
            </PerspectiveCamera>
        </Viewport3D.Camera>
    </Viewport3D>

我遗漏了什么吗?

所以,我猜它在某种程度上是通过渲染虚拟化的。也许不是——但我能在上面的代码中注意到的最好的一点是,它使用的是用户控件——而不是控件(Viewport3D)。当你运行代码时,它能通过吗?或者它会引发异常?

我能够在png保存到文件中时看到一些东西,我只是在测量和排列的调用之后添加了对UpdateLayout()的调用:

var viewport= (Viewport3D)XamlReader.Parse("... xaml ....");

viewport.Measure(new Size(viewport.Width, viewport.Height));
viewport.Arrange(new Rect(new Size(viewport.Width, viewport.Height)));
viewport.UpdateLayout();

var renderTargetBitmap = new RenderTargetBitmap((int)viewport.Width * 300 / 96,
                                                (int)viewport.Height * 300 / 96,
                                                300, 300, PixelFormats.Pbgra32);

renderTargetBitmap.Render(viewport);
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Clear();
encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
encoder.Save(new FileStream(@"D:\Test.png", FileMode.Create, FileAccess.Write));

谢谢你的回答。代码毫无例外地运行,创建了图像,但没有ViewPort3d(我在UserControl中也有图像)。我还尝试了另一个非常简单的ViewPort3D,我也有同样的问题。。。
var viewport= (Viewport3D)XamlReader.Parse("... xaml ....");

viewport.Measure(new Size(viewport.Width, viewport.Height));
viewport.Arrange(new Rect(new Size(viewport.Width, viewport.Height)));
viewport.UpdateLayout();

var renderTargetBitmap = new RenderTargetBitmap((int)viewport.Width * 300 / 96,
                                                (int)viewport.Height * 300 / 96,
                                                300, 300, PixelFormats.Pbgra32);

renderTargetBitmap.Render(viewport);
BitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Clear();
encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
encoder.Save(new FileStream(@"D:\Test.png", FileMode.Create, FileAccess.Write));