WPF中不规则窗体与WebBrowser控件的兼容问题解决办法
原文:WPF中不规则窗体与WebBrowser控件的兼容问题解决办法
引言
这几天受委托开发一个网络电视项目,要求初步先使用内嵌网页形式实现视频播放和选单,以后再考虑将网页中的所有功能整合进桌面程序。
播放器普遍都要有个看起来比较酷的外观,于是我就给设计了个不规则形状的带透明边框的外观,如下图:

但这个设计整合到WPF中时,却遇到了一个头疼的BUG:
只要设置窗体为AllowsTransparency="True" WindowStyle="None",内嵌的WebBrowser就无法显示了,但它还不是真的没有了,里面加载的视频还会正常播放、出声,甚至用鼠标去点网页内容还能正常交互,就是啥也看不到。
解决办法
那么我是如何解决的呢?
经过一系列搜索,我找到了这样的代码:
使用时首先要把这两个文件原封不动的复制到项目中:

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

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

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

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

缺陷
不过你需要知道,这个方法并不是完美的解决办法,而且目前好像还没有完美的办法能够解决此问题,此方法目前已知的问题如下:
- 会在程序开始时显示一个大白方块,然后才能正常显示界面。(求解决办法T_T)
- 使用Windows7的时候,拖动程序到屏幕左、右、上会自动停靠并改变窗体尺寸,这时嵌入的部分是无法跟随窗体大小变化的。(解决办法是强制设定最大、最小宽度和高度。可能有办法更新,但我没有详细测试,并且我的程序不支持拖拉改变大小,所以也没做这方面的测试)
- 主窗口隐藏时,嵌入部分不会随之隐藏。(解决办法是在隐藏主窗体时把WebBrowserOverlay对象也设为隐藏。我的程序最小化是直接到系统托盘的,所以没测试常规的最小化是否会产生同样的问题)
目前发现的就这些了,除了第一条比较痛苦,其他的都还好~
相关资料
http://kimiya25.spaces.live.com/blog/cns!27A083D4FD9435E9!1693.entry?wa=wsignin1.0&sa=675748223
下载
改进的WebBrowserOverlay类:http://cid-0612298d2255e149.skydrive.live.com/self.aspx/.Public/文档/WebBrowserOverlay.rar
PS:播放器可能得过些天才发布:)
PS2:有个关于.Net程序安装的问题向各位英雄求助:http://space.cnblogs.com/question/11103/
WPF中不规则窗体与WebBrowser控件的兼容问题解决办法的更多相关文章
- WPF中不规则窗体与WindowsFormsHost控件的兼容问题完美解决方案
首先先得瑟一下,有关WPF中不规则窗体与WindowsFormsHost控件不兼容的问题,网上给出的解决方案不能满足所有的情况,是有特定条件的,比如 WPF中不规则窗体与WebBrowser控件的兼 ...
- WPF 中动态创建和删除控件
原文:WPF 中动态创建和删除控件 动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName(" ...
- 封装:WPF中可以绑定的BindPassWord控件
原文:封装:WPF中可以绑定的BindPassWord控件 一.目的:本身自带的PassWord不支持绑定 二.Xaml部分 <UserControl x:Class="HeBianG ...
- WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件
动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName("Name") as 控 ...
- WPF中增加Month Calendar月历控件
XAML代码:(这里使用了codeproject.com网站上的一个Dll,你可以在这里下载它:http://www.codeproject.com/cs/miscctrl/MonthCalendar ...
- WPF中实现多选ComboBox控件
在WPF中实现带CheckBox的ComboBox控件,让ComboBox控件可以支持多选. 将ComboBox的ItemsSource属性Binding到一个Book的集合, public clas ...
- 在WPF中的Canvas上实现控件的拖动、缩放
如题,项目中需要实现使用鼠标拖动.缩放一个矩形框,WPF中没有现成的,那就自己造一个轮子:) 造轮子前先看看Windows自带的画图工具中是怎样做的,如下图: 在被拖动的矩形框四周有9个小框,可以从不 ...
- WPF中Expander的用法和控件模板详解
一.Expander的用法 在WPF中,Expander是一个很实用的复合控件,可以很方便的实现下拉菜单和导航栏等功能.先介绍简单的用法,而后分析他的控件模板. <Window.Resource ...
- SmartUpload控件 中文乱码问题解决办法
(乱码一般是三码不统一,但是当我们使用插件的时候,我们页面,后台,还有插件之间的转码不一定统一,导致了乱码这一问题) 首先,SmartUpload 的使用网上多的很,在这里就不在赘述,主要解决为什么乱 ...
随机推荐
- 【ASP.NET Web API教程】1 ASP.NET Web API入门
原文 [ASP.NET Web API教程]1 ASP.NET Web API入门 Getting Started with ASP.NET Web API第1章 ASP.NET Web API入门 ...
- java内存模型与线程(转) good
java内存模型与线程 参考 http://baike.baidu.com/view/8657411.htm http://developer.51cto.com/art/201309/410971_ ...
- UI编辑器
本篇教程通过制作捕鱼达人的启动界面来说明CocoStudio UI编辑器的用法.先看看效果图 好了,下面一步一步的动手做吧! 1.打开软件 2.新建项目 依次打开软件主界面左上角菜单栏的:“文件”-- ...
- (step4.3.9)hdu 1584(蜘蛛牌——DFS)
题目大意:本体是中文题,可以直接在OJ上看 /* * 1584_2.cpp * * Created on: 2013年8月22日 * Author: Administrator */ #include ...
- rsync使用指南
考虑到服务器数据的安全,我考虑增加一台备份服务器,通过数据同步,达到较好的冗余. linux下有非常好的一个命令rsync可以实现差异备份,下面就说说它的用法:ubuntu缺省安装的安装中,rsync ...
- Android 编程之第三方开发 MaoZhuaWeiBo微博开发演示样例-1
在大学期间我做过非常多类似这种APP.这个是我们小组之前做的,我后期增加非常多新元素.完好了这个应用,由于为了加强 专业技术嘛.也是常常熬夜写些小东西,嘿嘿.只是还算不错.起码技术长进了不少嘛,还是非 ...
- efwplus框架
此框架得到博客园大神@张善友的关注,建议我写一篇此框架的最新介绍,好在@dotNet跨平台公众号上推荐给大家,得到大神的指示当然激动,马不停蹄的赶出此文,供大家参考! 一.使用efwplus框架的 ...
- Java学习笔记——File类之文件管理和读写操作、下载图片
Java学习笔记——File类之文件管理和读写操作.下载图片 File类的总结: 1.文件和文件夹的创建 2.文件的读取 3.文件的写入 4.文件的复制(字符流.字节流.处理流) 5.以图片地址下载图 ...
- 调用ShellExecute需要头文件
调用ShellExecute需要头文件 #include "windows.h " #include "shellapi.h "
- 快速学会搭建SVN服务器
原文:快速学会搭建SVN服务器 SVN是一个版本控制工具,常用于我们软件开发项目中,用来管理我们团队共同使用的代码,文档等历史版本的管理,保持代码的更新,避免混乱. 需要工具: svn安装程序:免费下 ...