Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

有人会说不建议Wpf中使用Winform控件,有人会说建议使用Winform控件在Wpf下的替代方案,然而在实际工作中由于项目的特殊需求,考虑到时间、成本等因素,往往难免会碰到在WPF中使用Winfrom控件的问题,我们知道Wpf可以通过使用WindowsFormsHost容器调用Winform控件,但是在一些场合需要将Wpf元素显示在Winform控件的上层,此时就会出现Wpf元素被Winform控件遮盖的问题。

一、场景再现

接到公司命令,在时间紧迫的情况下,需要将原来的Winform程序(别人写的,自己压根没参与任何东西)替换成Wpf实现,给界面做个美容。首先看了看源码,了解到里面的知识盲点,主要一个就是用于地图展示的GMap.NET组件(一个开源的GIS二次开发组件),遂对GMap.NET进行了了解:GMap.net分为for winform及form wpf,且在Wpf下没有图层的概念,一些类结构的设计也月GMap.net.winform有变化,为了稳妥,不出现不必要的麻烦,快速改版应对项目要求,考虑仍使用要来的GMap.net.winform,只对展示层做修改。

1、添加Wpf调用Winform控件需要的两个DLL引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll以及GMap.Net.WindowsFroms的两个DLL引用:GMap.Net.Core.dll及GMap.Net.WindowsForms.dll。

2、程序运行时将MapControl控件处理后加载到WindowsFormsHost容器。

前台关键代码:

+

后台关键代码

+

设计状态时右下角图例区域设置为最顶层,如下图所示没有问题

程序运行时,winform类型的GMapControl控件会渲染在最上层,覆盖用于显示地图图例区域的右下角Wpf元素。

二、寻求解决方案

自己首先尝试了各种WPF界面布局方式,Canvas,各种Panel等都试了一遍,结果仍然是Wpf元素被Winform控件遮盖,遂去寻求网络帮助,得到的答案基本如下:

    三、最终解决方案

考虑如果是因为渲染机制问题,始终将winform控件渲染在最上层的话,能不能将Wpf元素也使用WindowsFormsHost容器进行一层包裹呢?理论上应该是可以得,于是进行尝试,最外层使用WindosFormsHost,然后是Wpf元素的容器ElementHost,最后是我们需要的WPF界面元素:

+

运行程序问题解决:

时间: 2024-09-29 22:07:49

Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决的相关文章

wpf显示视频,image控件闪屏,使用winform控件实现

使用C#调用mingw的动态库实现视频识别软件,程序通过C++调用opencv打开视频,将图像的原始数据以rgb24的方式传递给C#端,C#通过构造图像对象给控件赋值的方式显示图片. 一开始使用wpf的控件image: 1 while (true) 2 { 3 S_IMG simg = Mingw.display(); //调用取图像函数 4 int size = simg.w * simg.h * 3; 5 byte[] data = new byte[size]; 6 Marshal.Cop

DevExpress for WPF 使用换肤控件后在其他机器上无法运行问题

本人使用的DevExpress13.2.6的破解版.WPF的 在项目中使用了DevExpress的控件后在其他机器上无法运行,吓我一跳,然后我发现DLL都复制到本地了.这个是什么原因呢? 猜想是DLL引用了其他的DLL,或者是某些DLL需要注册.但是DLL那么多,并不知道是差哪些DLL,总不能全部弄过去吧,那么大.后来找了些资料问了下其他人用这个的问题,他们都说差DevExpress.Utils.v13.2.dll.但是实际上他们是winfrom的 和WPF不一样.根本不适合. 后来我一个个调试

初步探讨WPF的ListView控件(涉及模板、查找子控件)

本文结合模板的应用初步介绍ListView的应用 一.Xaml中如何建立数据资源 大部分数据都会来自于后台代码,如何Xaml同样的建立数据源呢?比如建立一个学生List: 首先引入命名空间: xmlns:c="clr-namespace:System.Collections;assembly=mscorlib" 然后代码如下:   <c:ArrayList x:Key="stuList">            <local:Student Id=

C# WPF 低仿网易云音乐(PC)歌词控件

原文:C# WPF 低仿网易云音乐(PC)歌词控件 提醒:本篇博客记录了修改的过程,废话比较多,需要项目源码和看演示效果的直接拉到文章最底部~ 网易云音乐获取歌词的api地址 http://music.163.com/api/song/media?id=歌曲ID 填写歌曲的id即可获取到json格式的数据(歌曲ID获取的方法是:点击分享按钮>其他分享>复制链接,就可以在链接中看到了): {"songStatus":0,"lyricVersion":10,

【C#/WPF】用Thumb做可拖拽的UI控件

原文:[C#/WPF]用Thumb做可拖拽的UI控件 需求:简单的可拖拽的图片 使用System.Windows.Controls.Primitives.Thumb类 前台: <Canvas x:Name="g"> <Thumb Canvas.Left="10" Canvas.Top="20" Canvas.ZIndex="99" DragDelta="Thumb_DragDelta"&g

【WPF学习】第二十四章 基于范围的控件

原文:[WPF学习]第二十四章 基于范围的控件 WPF提供了三个使用范围概念的控件.这些控件使用在特定最小值和最大值之间的数值.这些控件--ScrollBar.ProgressBar以及Slider--都继承自RangeBase类(该类又继承自Control类).尽管它们使用相同的抽象概念(范围),但工作方式却又很大的区别. 下表显示了RangeBase类定义的属性: 表 RangeBase类的属性 通常不比直接使用ScrollBar控件.更高级的ScrollViewer控件(封装了两个Scro

【WPF学习】第二十九章 元素绑定——将元素绑定到一起

原文:[WPF学习]第二十九章 元素绑定--将元素绑定到一起 数据banding的最简单情形是,源对象时WPF元素而且源属性是依赖性属性.前面章节解释过,依赖项属性具有内置的更改通知支持.因此,当在源对象中改变依赖项属性的值时,会立即更新目标对象中的绑定属性.这正是我们所需要的行为--而且不必为此构建任何额外的基础结构. 为理解如何将一个元素绑定到另一个元素,下面创建一个简单的示例.该示例窗口包含了两个控件:一个Slider控件和一个具有单行文本的TextBlock控件.如果向右拖动滑动条上的滑

VintaSoft Twain .net控件可用于桌面应用WinForm的扫描仪控件

VintaSoftTwain.NET SDK是成熟的扫描组件. 利用它, 程序员可以从.net和wpf的应用中控制的平板和ADF扫描仪,网络和数码相机和任何其他TWAIN设备. NET SDK提供的TWAIN .NET SDK 包括的两个版本:<标准版> 或 <标准+ WPF版本>. 功能特点: 完全兼容TWAIN 1.x和2.x标准规范编程环境:.NET Framework 2.0或以上, WPF 3.5 或以上.纯.NET 托管代码库,可保证在NET Framework框架下有

《Programming WPF》翻译 第5章 4.元素类型样式

原文:<Programming WPF>翻译 第5章 4.元素类型样式 命名样式非常有用,当你得到一组属性并应用到特点的元素上.然而,如果你想要应用一个统一的样式到所有确定元素类型的实例,设置TargetType而不用一个Key,如示例5-16所示. 示例5-16 <!-- no Key --> <Style TargetType="{x:Type Button}">   <Setter Property="FontSize"