幾天前我寫過一篇文章介紹使用 AxWebBrowser 控件作擴展, http://blog.csdn.Net/AppFramework/archive/2008/01/16/2047610.ASPx 。後來發現有些問題:
1)打開Html界面不是XP風格的平面式的,是老式的3D風格的。而用.Net自帶的 WebBrowser 控件打開的頁面是XP風格的。
2)直接使用AxWebBrowser的 Focus() 方法,大部分時候都無法 Focus 浏覽器控件;
後來查資料,發現 WebBrowser 控件的 ActiveXInstance 其實就是 SHDocVw.WebBrowser 接口,包含了豐富的事件和屬性,AxWebBrowser 似乎也是基於次接口進行封裝的。
WebBrowser webBrowser = new WebBrowser();
webBrowser.Navigate("about:blank");//這句話重要,要先訪問一個URL,否則ActiveXInstalce為空
SHDocVw.WebBrowser xBrowser = webBrowser.ActiveXInstance as SHDocVw.WebBrowser;
然後就可以用 xBrowser 的各個事件了。
由於 SHDocVw.WebBrowser 事件沒有 sender 參數,直接對 SHDocVw.WebBrowser 編程在處理事件時無法區分事件源,所以要對 SHDocVw.WebBrowser 進行封裝,我的做法是作一個 UserControl,裡面組合了 WebBrowser 控件,然後對 SHDocVw.WebBrowser 的事件進行包裝,包裝結果跟 AxWebBrowser 的對應事件一樣。
如此處理後,問題1)解決了,得到XP風格的界面;問題2)還在處理。因為 WebBrowser 是放在 TabControl 裡的,我從 TabControl 派生了一個類重寫了 OnGotFocus 方法。
... override OnGotFocus(...)
{
CurrentBrowser.Focus(); //CurrentBrowser 是當前想要激活的 WebBrowser 控件
}
總結:應該把 WebBrowser 和 AxWebBrowser 結合起來使用,各取所長