文章目录
- 一、场景
- 1、WPF控件
- 2、集成ActiViz或者VTK
- 二、问题
- 1、需求
- 2、空域问题
- 三、解决方案
- 1、用WindowsFormsHost包裹住ElementHost,然后将WPF的控件放在ElementHost职中:
- 2、用Window或者Popup去悬浮
- 3、使用第三方库Microsoft.DwayneNeed(这也是网上出现较多的答案)
- 四、最新解决方案
- 1、步骤
- 2、需要用到的库
- 3、关键代码如下:
- 4、运行结果预览:
- 5、源码链接
- 五、总结
一、场景
1、WPF控件
众所周知,由于WPF的底层绘制原理不同,WPF的大多数控件都不具备句柄,具备句柄的也就只有那么几种:Window、Popup、ContextMenu等。
2、集成ActiViz或者VTK
在集成VTK时: 一般选择WindowsFormsHost作为载体,将WinForm具备句柄的控件:如Panel,嵌入WPF布局中。然后将Panel的句柄传给C++。
在集成ActiViz时: 需要以RenderWindowControl来承接三维渲染内容,同样一般选择WindowsFormsHost作为载体,将RenderWindowControl放入其中,然后渲染三维内容。
二、问题
1、需求
如果需求是在三维布局界面,悬浮一些控件,且控件的背景色可以设置成透明。
2、空域问题
你会发现悬浮的WPF控件,始终在WindowsFormsHost之下,也就是说WindowsFormsHost所承载的内容始终置顶。这就是WPF由来已久的空域问题。