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

2023-11-12

背景

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

csharp

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

<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

<xmlns:interop=clr-namespace:Microsoft.DwayneNeed.Interop;assembly=Microsoft.DwayneNeed>
</xmlns>

在xaml中使用AirspaceDecorator包裹WindowsFormsHost

完整例子如下

xml

<airspace:AirspaceDecorator AirspaceMode="Redirect" IsInputRedirectionEnabled="True" IsOutputRedirectionEnabled="True">
    <WindowsFormsHost Name="FormsHost">
        <winform:WebBrowser>
    </WindowsFormsHost>
</airspace:AirspaceDecorator>

 

 文章作者: Mr.Demon

 文章链接: https://www.xpnas.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF中WindowFormsHost始终置顶的有效解决方案 的相关文章

随机推荐

  • Linux C 进程管道流

    Linux C 进程管道流 一 Pipe 二 示例 一 Pipe popen pclose pipe stream to or from a process popen和pclose是用于创建读写进程的管道流的函数 二 示例 本例简单介绍一
  • js发送ajax post请求

    先说一下使用步骤 1 创建XHR对象 let ajax new XMLHttpRequest 2 监听XHR对象的状态改变事件 ajax onreadystatechange function if ajax readyState 4 注
  • 总结30个Python赚钱的接单平台!兼职月入5000+,成年人的世界,钱是活下去的筹码

    前言 如果说当下什么编程语言最靠谱或者比较适合搞副业 答案肯定100 是 Python python是所有语法中最简单易上手的语言 不需要特别的的英语词汇量 逻辑思维也不需要很差就能上手 而且学会了之后就能编写代码爬取各种数据 制作各种图表
  • Spring @Transactional 中的事务传播和隔离

    20211030Spring Transactional 中的事务传播和隔离 1 介绍 介绍 Transactional 注释 以及它的隔离和传播设置 2 什么是 Transactional 可以使用 Transactional 将方法包装
  • 语音识别之HMM算法及其源码

    基础 1 了解HMM算法 http www cnblogs com pangxiaodong archive 2011 10 17 2214542 html 2 再次加深印象 http blog csdn net likelet artic
  • Python3 lambda函数简单理解

    lambda存在意义就是对简单函数的简洁表示 比如函数f def f x return x 2 可以写成 f lambda x x 2 格式为 lambda 参数 返回值 参数可以有多个 用逗号隔开 lambda常搭配内置函数map fil
  • 点云三维重建的原理,在医学图像分析中使用ICP算法进行点云配准

    1 摘要 在本文中 我们结合了ICP算法 一种基于3D尺度不变特征变换的方法 对3D自由形式闭合的曲面 人类头骨的3D模型 进行配准 不同于点和表面的配准 我们提出的基于ICP算法的方法可以更好地捕获数据的整体性质 例如骨骼厚度 文中提出的
  • 伺服驱动器cn1引脚定义_PCI-9014端子板DIN-68S和安川驱动器(SGDV-R90A01A002000)接线图...

    摘要 PCI 9014端子板DIN 68S和安川驱动器 SGDV R90A01A002000 接线图 硬件 运动控制卡型号 PCI 9014 以下接线仅以X轴为例说明 伺服驱动器型号 SGDV R90A01A002000 伺服电机型号 SG
  • 【物联网开发基础】在keil中怎么烧写程序

    什么是keil Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统 与汇编相比 C语言在功能上 结构性 可读性 可维护性上有明显的优势 因而易学易用 Keil提供了包括C编译器 宏汇编 链接器 库
  • L1-058 6翻了 (15 分)-PAT 团体程序设计天梯赛 GPLT

    解题思路 遍历字符串 不是6字符的直接输出 出现6的时候 往后判断出现了几次6 进而决定是否替换字符串 include
  • Swift5 不是循环的双链表

    小萌毕业5年了 一直在做移动端的工作 OC和Swift 最近比较流行的就是Swift了 学习过OC和Swift的基本原理 听的云里雾里的 听了好几遍才理解 因此下定决心要学习数据结构 学习之后发现数据结构和算法不愧是开发人员必学的知识 双链
  • Visual Studio 2019实现c51上位机控制数码管显示数字

    Visual Studio 2019实现c51上位机控制数码管显示数字 初学者编写上位机程序 上位机编写环境 上位机窗体设计 上位机界面功能代码 form界面 打开串口 代码 发送 按钮代码 上位机机全部代码 单片机烧录代码 效果图 初学者
  • PAT1-第39级台阶(递归)

    第39级台阶 小明刚刚看完电影 第39级台阶 离开电影院的时候 他数了数礼堂前的台阶数 恰好是39级 站在台阶前 他突然又想着一个问题 如果我每一步只能迈上1个或2个台阶 先迈左脚 然后左右交替 最后一步是迈右脚 也就是说一共要走偶数步 那
  • 捕鱼游戏、slots游戏出海技术支持

    捕鱼和slots类游戏的核心为数值 在美术 程序 音效 玩法都OK的情况下 数值是核心 这类游戏的数值思维方式要区别于其它类型的游戏看待 对于转型进入这个领域的团队和老板在数值上面 算法上面没有积累 对产品理解不够深入最后都是以失败告终 在
  • [QNX700]QNX 7.0 平台QT开发环境配置

    锋影 email 174176320 qq com 如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 1 QNX q
  • feign 出现 too many bytes written executing xx Or incomplete output stream executing xx

    问题 通过FeignClient调用第三方接口时 出现如下报错 incomplete output stream executing xxx 或者 too many bytes written executing POST 解决办法 自定义
  • 【windows系统cmd下打开管理员模式】

    runas noprofile user Administrator cmd
  • 离职报告提交前一秒,再检查下这些测试思维面试题你都会了么?

    创建坐席组的功能模块 如何进行测试用例设计 解答 功能测试 使用等价类划分法去分析创建坐席的每个输入项的有效及无效类 同步考虑边界值去设计对应的测试用例 先进行冒烟测试 正常创建坐席 坐席组编号自动生成且确认 6 位数字唯一 名称输入 10
  • UE4材质11_材质参数集

    11 1 参数集全局控制材质 创建材质参数集 MPC 材质参数集的前缀 材质参数集可以添加标量和向量 标量一般就是数字 向量就是颜色或者是X Y Z 一个材质最多只能使用两个材质参数集 11 2 蓝图传递参数集及实例参数 打开关卡蓝图 添加
  • WPF中WindowFormsHost始终置顶的有效解决方案

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