C# 使用SlimDX呈现Direct3D内容时,不呈现WPF UI

C# 使用SlimDX呈现Direct3D内容时,不呈现WPF UI,c#,wpf,slimdx,C#,Wpf,Slimdx,我正在从事一个项目,在这个项目中,我有一个托管在WPF应用程序中的D3DImage。我在D3DImage上呈现了其他WPF控件,每个控件都有透明的背景。但是,当我渲染场景时,我的UI会消失,直到我将鼠标悬停在控件上(可能会强制它们重新渲染) 我知道这不应该是一个问题,因为我最近完成了这项工作,没有这个问题,但我不再有那个项目,所以我无法比较我的代码。如果有人知道这可能是什么,我洗耳恭听。明天早上,我将创建一个小测试项目,试图复制这个问题;那么我将更新这个问题 编辑 我已经设法在一个简单的项目中重

我正在从事一个项目,在这个项目中,我有一个托管在WPF应用程序中的D3DImage。我在D3DImage上呈现了其他WPF控件,每个控件都有透明的背景。但是,当我渲染场景时,我的UI会消失,直到我将鼠标悬停在控件上(可能会强制它们重新渲染)

我知道这不应该是一个问题,因为我最近完成了这项工作,没有这个问题,但我不再有那个项目,所以我无法比较我的代码。如果有人知道这可能是什么,我洗耳恭听。明天早上,我将创建一个小测试项目,试图复制这个问题;那么我将更新这个问题

编辑 我已经设法在一个简单的项目中重现了我遇到的问题,可以下载。注意:要运行该项目,您需要安装最新的SlimDX

编辑
注释掉该测试项目中对D3DImage.AddDirtyRect(…)的调用会导致正确绘制UI。但是,当旋转对象时(随后在旋转更新时重新渲染3D内容),UI会闪烁,并且不会始终重新绘制。

我找到了问题的原因。基本上,在WPF中,当使用D3DImage作为Direct3D内容的渲染表面时,不能使用Device.Present()方法调用,因为这将处理前端缓冲区的呈现。不应这样做,因为D3DImage需要自行处理此问题,以便应用正确的透明度(有关此问题的更多信息,请参阅)

简单地说,我的修复由两部分组成:

  • 使用
    surface.CreateRenderTarget(…)
    创建渲染曲面后,我必须使用
    mDevice.SetRenderTarget(0,mSurface)
    将目标传递给设备。这允许在曲面上进行渲染
  • 在渲染操作期间,我删除了对
    Device.Present()
    的调用,以便WPF能够处理正确的缓冲区渲染
  • 我敢说这个解释并不是100%准确,但是通过阅读这个链接以及围绕D3DImage的MSDN文档,应该可以澄清这一点