前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WPF中WindowFormsHost始终置顶的有效解决方案

WPF中WindowFormsHost始终置顶的有效解决方案

作者头像
zls365
发布2020-12-15 15:10:47
2.2K0
发布2020-12-15 15:10:47
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全

背景

WPF的原生控件并不具备自身的句柄,即使使用偏门的方式获取的结果也都是控件所在窗体的句柄,并不代表该控件本身的资源,这是由WPF的自身的机制决定的。

csharp

代码语言:javascript
复制
IntPtr hwnd1 = new WindowInteropHelper(this).Handle; 
IntPtr hwnd2 = ((HwndSource)PresentationSource.FromVisual(uielement)).Handle;

到此需要了解下Winform与WPF的区别,WPF和winform最大的区别在于WPF底层使用的DirectX,winform底层使用的是GDI+,所以WPF的图形界面上更胜一筹。

  • GDI+(Graphics Device Interface)图形设备接口,它的主要任务是负责绘图程序之间的信息交换、处理,所有windows程序的图形输出
  • DirectX(Direct Extension)多媒体编程接口,加强3D图形和声音效果,有很多API组成。按照性质分类可分为四大部分:显示部分,声音部分,输入部分和网络部分。

应时而生WindowFormsHost

当我们直接使用WPF的控件句柄作为OSG等第三方控件的绘制视图区域时,我们会发现视图区域占据了整个窗体,这与上面提到的WPF的原生控件并不具备自身的句柄的结论一致。

为解决上述问题,在WPF中嵌入第三方控件时,往往需要借助WindowFormsHost控件,使用该控件可以包裹Winform控件,再将Winform的句柄暴露给第三方控件,即可实现在指定区域进行类似OSG视图的绘制。

xml

代码语言:javascript
复制
<WindowsFormsHost Name="FormsHost">
    <winform:WebBrowser>
</WindowsFormsHost>

三、WindowFormsHost的置顶缺陷

在WPF中调用windowFormsHost的控件时,由于渲染机制的问题总会出现各种问题,让许多人纠结头疼的便是:

windowFormsHost控件在一个位置时会优先显示,而且完全设置不了顺序,永远在最上边,WPF原生的控件无法对其遮盖,更别说透明了

四、解决WindowFormsHost的置顶问题

经过层层排除和筛选,最终找到一个可行方案:Microsoft.DwayneNeed

  • 访问:Microsoft.DwayneNeed下载源码
  • 使用VS打开Microsoft.DwayneNeed.sln解决方案,完成编译
  • 在WPF项目中添加Microsoft.DwayneNeed.dll引用
  • 在xaml中添加

xml

代码语言:javascript
复制
<xmlns:interop=clr-namespace:Microsoft.DwayneNeed.Interop;assembly=Microsoft.DwayneNeed>
</xmlns>

在xaml中使用AirspaceDecorator包裹WindowsFormsHost

完整例子如下

xml

代码语言:javascript
复制
<airspace:AirspaceDecorator AirspaceMode="Redirect" IsInputRedirectionEnabled="True" IsOutputRedirectionEnabled="True">
    <WindowsFormsHost Name="FormsHost">
        <winform:WebBrowser>
    </WindowsFormsHost>
</airspace:AirspaceDecorator>
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 应时而生WindowFormsHost
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档