这几天受委托开发一个网络电视项目要求初步先使用内嵌网页形式实现视频播放和选单以后再考虑将网页中的所有功能整合进桌面程序。播放器普遍都要有个看起来比较酷的外观于是我就给设计了个不规则形状的带透明边框的外观如下图但这个设计整合到WPF中时却遇到了一个头疼的BUG只要设置窗体为AllowsTransparencyTrue WindowStyleNone内嵌的WebBrowser就无法显示了但它还不是真的没有了里面加载的视频还会正常播放、出声甚至用鼠标去点网页内容还能正常交互就是啥也看不到。解决办法那么我是如何解决的呢经过一系列搜索我找到了这样的代码前台XAML文件http://www.google.cn/codesearch/p?hlzh-CN#ihfHhUg5N2k/trunk/vs2010/meta/Glu/Helper/WebBrowserOverlay.xamlqWebBrowserOnTransparentWindowd5后台CS文件http://www.google.cn/codesearch/p?hlzh-CN#ihfHhUg5N2k/trunk/Glu/Helper/WebBrowserOverlay.xaml.csqWebBrowserOnTransparentWindowd3使用时首先要把这两个文件原封不动的复制到项目中然后在你要加载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对象也设为隐藏。我的程序最小化是直接到系统托盘的所以没测试常规的最小化是否会产生同样的问题目前发现的就这些了除了第一条比较痛苦其他的都还好~
WPF中不规则窗体与WebBrowser控件的兼容问题解决办法
发布时间:2026/7/6 4:03:19
这几天受委托开发一个网络电视项目要求初步先使用内嵌网页形式实现视频播放和选单以后再考虑将网页中的所有功能整合进桌面程序。播放器普遍都要有个看起来比较酷的外观于是我就给设计了个不规则形状的带透明边框的外观如下图但这个设计整合到WPF中时却遇到了一个头疼的BUG只要设置窗体为AllowsTransparencyTrue WindowStyleNone内嵌的WebBrowser就无法显示了但它还不是真的没有了里面加载的视频还会正常播放、出声甚至用鼠标去点网页内容还能正常交互就是啥也看不到。解决办法那么我是如何解决的呢经过一系列搜索我找到了这样的代码前台XAML文件http://www.google.cn/codesearch/p?hlzh-CN#ihfHhUg5N2k/trunk/vs2010/meta/Glu/Helper/WebBrowserOverlay.xamlqWebBrowserOnTransparentWindowd5后台CS文件http://www.google.cn/codesearch/p?hlzh-CN#ihfHhUg5N2k/trunk/Glu/Helper/WebBrowserOverlay.xaml.csqWebBrowserOnTransparentWindowd3使用时首先要把这两个文件原封不动的复制到项目中然后在你要加载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对象也设为隐藏。我的程序最小化是直接到系统托盘的所以没测试常规的最小化是否会产生同样的问题目前发现的就这些了除了第一条比较痛苦其他的都还好~