原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法

引言

这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序。

播放器普遍都要有个看起来比较酷的外观,于是我就给设计了个不规则形状的带透明边框的外观,如下图:

但这个设计整合到WPF中时,却遇到了一个头疼的BUG:

只要设置窗体为AllowsTransparency="True" WindowStyle="None",内嵌的WebBrowser就无法显示了,但它还不是真的没有了,里面加载的视频还会正常播放、出声,甚至用鼠标去点网页内容还能正常交互,就是啥也看不到。

解决办法

那么我是如何解决的呢?

经过一系列搜索,我找到了这样的代码:

前台XAML文件:http://www.google.cn/codesearch/p?hl=zh-CN#ihfHhUg5N2k/trunk/vs2010/meta/Glu/Helper/WebBrowserOverlay.xaml&q=WebBrowserOnTransparentWindow&d=5

后台CS文件:http://www.google.cn/codesearch/p?hl=zh-CN#ihfHhUg5N2k/trunk/Glu/Helper/WebBrowserOverlay.xaml.cs&q=WebBrowserOnTransparentWindow&d=3

使用时首先要把这两个文件原封不动的复制到项目中:

然后在你要加载WebBrowser的地方放置一个命名的Border元素:

然后在后台代码中这样设置:

这样你原来的Border的位置就会被载入一个WebBrowser了。

它的原理貌似就是利用一个没有不规则形状及透明新窗体承载WebBrowser,这样就避免了我们之前遇到的灵异问题,然后再通过一些Win32的API调整显示,使我们看起来和整合在一起没有什么分别,最终达成的效果如下:

稍加改进

上述的WebBrowser始终都是指的System.Windows.Controls.WebBrowser,它虽然可以被WPF直接嵌入,但它是一个废柴,相比WinForm中的WebBrowser的功能来说逊色太多了,所以我改动了一下代码,使WebBrowserOverlay类不再承载WebBrowser,而是承载WindowsFormsHost,然后我们可以自行向其中添加我们惯用的System.Windows.Forms.WebBrowser控件,改动后的使用方法变成了这样:

缺陷

不过你需要知道,这个方法并不是完美的解决办法,而且目前好像还没有完美的办法能够解决此问题,此方法目前已知的问题如下:

  1. 会在程序开始时显示一个大白方块,然后才能正常显示界面。(求解决办法T_T)
  2. 使用Windows7的时候,拖动程序到屏幕左、右、上会自动停靠并改变窗体尺寸,这时嵌入的部分是无法跟随窗体大小变化的。(解决办法是强制设定最大、最小宽度和高度。可能有办法更新,但我没有详细测试,并且我的程序不支持拖拉改变大小,所以也没做这方面的测试)
  3. 主窗口隐藏时,嵌入部分不会随之隐藏。(解决办法是在隐藏主窗体时把WebBrowserOverlay对象也设为隐藏。我的程序最小化是直接到系统托盘的,所以没测试常规的最小化是否会产生同样的问题)

目前发现的就这些了,除了第一条比较痛苦,其他的都还好~

相关资料

http://kimiya25.spaces.live.com/blog/cns!27A083D4FD9435E9!1693.entry?wa=wsignin1.0&sa=675748223

http://203.208.39.132/search?q=cache:J1BEG4zMNm0J:blogs.msdn.com/changov/archive/2009/01/19/webbrowser-control-on-transparent-wpf-window.aspx+http://blogs.msdn.com/changov/archive/2009/01/19/webbrowser-control-on-transparent-wpf-window.aspx.&cd=1&hl=zh-CN&ct=clnk&gl=cn&st_usg=ALhdy2-PnD6k-eTfya4Ygo-G9K99cEGV2A

http://www.google.cn/codesearch?q=WebBrowserOnTransparentWindow&hl=zh-CN&btnG=%E6%90%9C%E7%B4%A2%E4%BB%A3%E7%A0%81

下载

改进的WebBrowserOverlay类:http://cid-0612298d2255e149.skydrive.live.com/self.aspx/.Public/文档/WebBrowserOverlay.rar

本文的XPS版本:http://cid-0612298d2255e149.skydrive.live.com/self.aspx/.Public/文档/WPF中不规则窗体与WebBrowser控件的兼容问题解决办法.xps

PS:播放器可能得过些天才发布:)

PS2:有个关于.Net程序安装的问题向各位英雄求助:http://space.cnblogs.com/question/11103/

WPF中不规则窗体与WebBrowser控件的兼容问题解决办法的更多相关文章

  1. WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案

    首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如  WPF中不规则窗体与WebBrowser控件的兼 ...

  2. WPF 中动态创建和删除控件

    原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件.FindName(" ...

  3. 封装:WPF中可以绑定的BindPassWord控件

    原文:封装:WPF中可以绑定的BindPassWord控件 一.目的:本身自带的PassWord不支持绑定 二.Xaml部分 <UserControl x:Class="HeBianG ...

  4. WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件

    动态创建控件 1.容器控件.RegisterName("Name",要注册的控件)   //注册控件 2.容器控件.FindName("Name") as  控 ...

  5. WPF中增加Month Calendar月历控件

    XAML代码:(这里使用了codeproject.com网站上的一个Dll,你可以在这里下载它:http://www.codeproject.com/cs/miscctrl/MonthCalendar ...

  6. WPF中实现多选ComboBox控件

    在WPF中实现带CheckBox的ComboBox控件,让ComboBox控件可以支持多选. 将ComboBox的ItemsSource属性Binding到一个Book的集合, public clas ...

  7. 在WPF中的Canvas上实现控件的拖动、缩放

    如题,项目中需要实现使用鼠标拖动.缩放一个矩形框,WPF中没有现成的,那就自己造一个轮子:) 造轮子前先看看Windows自带的画图工具中是怎样做的,如下图: 在被拖动的矩形框四周有9个小框,可以从不 ...

  8. WPF中Expander的用法和控件模板详解

    一.Expander的用法 在WPF中,Expander是一个很实用的复合控件,可以很方便的实现下拉菜单和导航栏等功能.先介绍简单的用法,而后分析他的控件模板. <Window.Resource ...

  9. SmartUpload控件 中文乱码问题解决办法

    (乱码一般是三码不统一,但是当我们使用插件的时候,我们页面,后台,还有插件之间的转码不一定统一,导致了乱码这一问题) 首先,SmartUpload 的使用网上多的很,在这里就不在赘述,主要解决为什么乱 ...

随机推荐

  1. js浏览器对象模型(BOM)

    浏览器对象模型(Browser Object Model,BOM):浏览器为js提供的对象集合. 1 windows对象 windows对象:表示浏览器的框架以及与其相关的内容,比如滚动条和导航栏图标 ...

  2. EF中执行sql语句,以及事务

    EF to sql string sql = "select T_Task.BSID,T_Task.CloseDate,T_Task.CompleteDate,T_Task.CloseUse ...

  3. 反人类的MyEclipse之-MyEclipse代码自动补全

    如果你用过Visual Studio的自动补全功能后,再来用eclipse的自动补全功能,相信大家会有些许失望. 但是eclipse其实是非常强大的,eclipse的自动补全没有VS那么好是因为ecl ...

  4. UNIX基础--进程和守护进程

    进程和守护进程 Processes and Daemons 进程(Processes) FreeBSD 是一个多任务操作系统. 这就意味着好像一次可以运行一个以上的程序. 每个占用一定时间运行的程序就 ...

  5. bzoj-1834 network 网络扩容 【网络流】

    这题就是复习下网络流. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #def ...

  6. opacity 与rgba区别

    rgba(r,g,b,a) rgba(r,g,b,a) r,g,b分别是颜色r g b的值(0-255),a表示透明度(0-1). opacity: value: opacity: value; va ...

  7. ngx.re.match使用示例

    s='...12ab345cde...' r, e = ngx.re.match(s,'(\\d+)([a-z]+)(?<num>\\d+)(?<word>[a-z]+)') ...

  8. forbidden

  9. 【前端vue开发】vue单页应用添加百度统计

    前言 申请百度统计后,会得到一段JS代码,需要插入到每个网页中去,在Vue.js项目首先想到的可能就是,把统计代码插入到index.html入口文件中,这样就全局插入,每个页面就都有了;这样做就涉及到 ...

  10. https跳转到http的过程在IE6中存在BUG(Bea-090475)

    前段时间做OA系统的https的安全登录功能(以前登录是采用的一般的http方式,后因为安全性考虑需要改成https的方式)在本机测试完全通过. 可是近期同事发现在测试环境下用IE6访问会出现不能访问 ...