空域问题是由于Winform与WPF在底层渲染机制上有所区别而导致的。多数情况下,开发者为了实现不规则的窗体并承载Winform控件时,遇到此类问题。当WPF窗体设置为允许透明(也就是AllowsTransparency=True)时,Winform Control 会出现不显示等情况,为了避免此问题,许多UI框架在实现不规则窗体时,用Win32 API 去实现不规则窗体的一些特效,比如透明,圆角等,这样WPF窗口的AllowsTransparency属性就可以设为FALSE,从而绕过了空域问题。但对于没有接触过Window底层开发的同学开发成本会比较高,而且有些特殊情况下,必须设AllowsTransparency为True时,该如何解决?

  • 第一种也是网络上最普遍的方法,简单说就是内嵌窗体,这个方法就不再说明。
  • 第二种也是我解决此问题的方法,使用第三方库解决空域的问题

利用第三方库解决空域问题

Microsoft.DwayneNeed(

https://microsoftdwayneneed.codeplex.com/

),这个库在其项目介绍里也写到

Mitigating "airspace" issues in WPF applications.

可能看出这个库也不能完美的解决空域的问题,也只能等微软去完善此问题了。

以Winform中强大的WebBrower为例,简单说一下使用方法:

  • 新建WPF窗体项目并添加Microsoft.DwayneNeed.dll与Microsoft.DwayneNeed.Win32.dll的引用
  • 添加 xmlns:airspace="clr-namespace:Microsoft.DwayneNeed.Interop;assembly=Microsoft.DwayneNeed"的声明
<airspace:AirspaceDecorator AirspaceMode="Redirect" IsInputRedirectionEnabled="True" IsOutputRedirectionEnabled="True">
<WindowsFormsHost Name="FormsHost">
<winform:WebBrowser/>
</WindowsFormsHost>
</airspace:AirspaceDecorator>

结束

这种方法是不是使用起来简单多了呢? 如果你有更好的解决方法,也要给大家分享哦!

链接分享

互操作性 https://msdn.microsoft.com/zh-cn/library/aa970688.aspx

使用内嵌窗体解决空域问题 http://blog.csdn.net/hikaliv/article/details/5922871

Microsoft.DwayneNeed https://microsoftdwayneneed.codeplex.com/

如何 “解决” WPF中空域问题(Airspace issuse)的更多相关文章

  1. 解决WPF中异常导致的程序Crash

    通常在WPF中出现异常,会导致程序Crash,即使把异常Throw出来,依旧会报错,解决方法只需在App.xaml.cs中进行处理即可,废话不说,代码如下: private int exception ...

  2. 解决WPF中TextBox文件拖放问题

    在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功).造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同,具体可参考这篇文章Textbox ...

  3. 解决WPF中重载Window.OnRender函数失效问题

    今天实验一个绘图算法的时候,偶然发现重载Window.OnRender的方法是没有效果的. public partial class MainWindow : Window { public Main ...

  4. WPF中PasswordBox控件无法绑定Password属性解决办法

    在WPF中,默认的Password控件的Password属性是不允许为之绑定的,下面是一个解决绑定Password的方法的代码: 1.前台代码 <Window x:Class="Pas ...

  5. 解决VS2019中.net core WPF 暂时无法使用 Designer 的临时方法

    目录 解决 VS2019 中.net core WPF 暂时无法使用 Designer 的临时方法 安装 vs 2019 professional/enterprise版本 在vs的设置里,勾选.NE ...

  6. 解决COM组件在WPF设计器中命名空间不存在XXX的问题(附带如何在WPF中使用APlayer引擎)

    总结起来就是:设计器的版本要跟外部引用的库版本一致,否则XAML设计器就会显示不出来. 例如你的程序是X64的,但是引用的COM组件是32位的,就会显示不出来.这里的建议是:编译一个32位的COM中间 ...

  7. 解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题

    解决WPF程序中ListBox ItemsSource变化时不重置ScrollBar的问题 当我们改变ListBox的ItemsSource时,会发现这样一个问题:数据源变化时,虽然控件中的内容会跟着 ...

  8. 关于WPF中ItemsControl系列控件中Item不能继承父级的DataContext的解决办法

    WPF中所有的集合类控件,子项都不能继承父级的DataContext,需要手动将绑定的数据源指向到父级控件才可以. <DataGridTemplateColumn Header="操作 ...

  9. WPF中在摄像头视频上叠加控件的解决方案

    一.视频呈现 前段时间,在一个wpf的项目中需要实时显示ip摄像头,对此的解决方案想必大家都应该知道很多.在winform中,我们可以将一个控件(一般用panel或者pictruebox)的句柄丢给摄 ...

随机推荐

  1. .NET/MVC-ViewBag、ViewData、TempData区别

    1.ViewData ViewData的生命周期和View相同, 只对当前View有效. 2.TempData TempData保存在Session中, Controller每次执行请求的时候会从Se ...

  2. TestNG测试报告美化

    因TestNG自带的测试报告不太美观,可以使用testng-xslt进行美化 1.下载testng-xslt包 2.把/src/main/resources/TestNG-results.xsl放到你 ...

  3. (剑指Offer)面试题37:两个链表的第一个公共结点

    题目: 输入两个链表,找出它们的第一个公共结点. 链表结点的定义如下: struct ListNode{ int val; ListNode* next; ListNode(int x):val(x) ...

  4. java中的初始化块

    public class Person { int a=6;//声明实例变量制定默认值,也可以认为是对象的初始化代码,执行顺序与源代码中的排列顺序相同 { System.out.println(&qu ...

  5. 在k8s中的基本概念

    在k8s中的基本概念 一.Pod1. podk8s下最重要也最基本的概念,由一个根容器Pause和许多用户业务容器组成,是容器的载体. 2. pod的yaml定义格式及字段 apiVersion: v ...

  6. C 输入一串数字,去掉当中含7的和能被7整除的数

    C 输入一串数字,去掉当中含7的和能被7整除的数,每一个数小于10000,数字个数小于100 输入样例:1,7,56,77,87,2,45,42,97,9977 输出:1,2,45 注意:输入个数不确 ...

  7. oracle 查询 函数练习

    /*--以下代码是对emp表进行显示宽度设置col empno for 9999;col ename for a10;col job for a10;col mgr for 9999; col hir ...

  8. 使用 WinEdt 来写中文文章or 建模论文

    找了几乎两个小时…… 后来发现… WinEdt 是可以用来写中文文章的…而并非只能英文文章或演示文稿… \documentclass{article} \usepackage{CJK} \begin{ ...

  9. simpleRNN

    simpleRNN 训练集为<爱丽丝梦境>英文版txt文档,目标:根据随机给出的10个字符,生成可能的后100个字符 词向量空间生产 In [4]: INPUT_FILE = " ...

  10. Android studio 使用心得(四)—android studio 多渠道打包(二)

    Android studio 使用心得(四)—android studio 多渠道打包 这篇文章讲了一种打包方式.是直接在android studio 里面可视化操作,结合配置文件.我个人觉得严格上来 ...