引言
這幾天受委托開發一個網絡電視項目,要求初步先使用內嵌網頁形式實現視頻播放和選單,以後再考慮將網頁中的所有功能整合進桌面程序。
播放器普遍都要有個看起來比較酷的外觀,於是我就給設計了個不規則形狀的帶透明邊框的外觀,如下圖:
但這個設計整合到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控件,改動後的使用方法變成了這樣:
不過你需要知道,這個方法並不是完美的解決辦法,而且目前好像還沒有完美的辦法能夠解決此問題,此方法目前已知的問題如下:
目前發現的就這些了,除了第一條比較痛苦,其他的都還好~
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
摘自 http://skyd.cnblogs.com/