程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> WPF中不規則窗體與WebBrowser控件的兼容問題解決辦法

WPF中不規則窗體與WebBrowser控件的兼容問題解決辦法

編輯:C#入門知識

引言

這幾天受委托開發一個網絡電視項目,要求初步先使用內嵌網頁形式實現視頻播放和選單,以後再考慮將網頁中的所有功能整合進桌面程序。

播放器普遍都要有個看起來比較酷的外觀,於是我就給設計了個不規則形狀的帶透明邊框的外觀,如下圖:

image

但這個設計整合到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

使用時首先要把這兩個文件原封不動的復制到項目中:

image

然後在你要加載WebBrowser的地方放置一個命名的Border元素:

image

然後在後台代碼中這樣設置:

image

這樣你原來的Border的位置就會被載入一個WebBrowser了。

它的原理貌似就是利用一個沒有不規則形狀及透明新窗體承載WebBrowser,這樣就避免了我們之前遇到的靈異問題,然後再通過一些Win32的API調整顯示,使我們看起來和整合在一起沒有什麼分別,最終達成的效果如下:

image

 

 

 

 

 

稍加改進

上述的WebBrowser始終都是指的System.Windows.Controls.WebBrowser,它雖然可以被WPF直接嵌入,但它是一個廢柴,相比WinForm中的WebBrowser的功能來說遜色太多了,所以我改動了一下代碼,使WebBrowserOverlay類不再承載WebBrowser,而是承載WindowsFormsHost,然後我們可以自行向其中添加我們慣用的System.Windows.Forms.WebBrowser控件,改動後的使用方法變成了這樣:

image

缺陷

不過你需要知道,這個方法並不是完美的解決辦法,而且目前好像還沒有完美的辦法能夠解決此問題,此方法目前已知的問題如下:

  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

 摘自 http://skyd.cnblogs.com/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved