2013-03-12 135 views
1

我正在嘗試實現簡單的網頁截屏程序。當我在UI線程上使用我的代碼時,似乎都沒有問題,但是當我從非UI線程調用方法時,我無法讓WebBrowserDocumentCompleted事件再次觸發。我也試過這個:Web瀏覽器未觸發DocumentCompleted事件

System.Windows.Forms.WebBrowser wb = new System.Windows.Forms.WebBrowser(); 
     wb.DocumentCompleted += WebBrowserDocumentCompleted; 
     wb.Visible = true; 
     wb.ScrollBarsEnabled = false; 
     wb.ScriptErrorsSuppressed = true; 
     wb.Navigate(url); 

     while (wb.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete) 
     { 
      Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, 
               new Action(delegate { })); 
     } 

程序只是掛在while循環,無限期地。有任何想法嗎?

+0

你不應該等待DocumentCompeleted事件,你應該啓動你的動作,當它觸發(在事件處理程序中) – Casperah 2013-03-12 20:34:53

回答

3

事情是這樣的:

public void Start() 
{ 
    System.Windows.Forms.WebBrowser wb = new System.Windows.Forms.WebBrowser(); 
    wb.DocumentCompleted += WebBrowserDocumentCompleted; 
    wb.Visible = true; 
    wb.ScrollBarsEnabled = false; 
    wb.ScriptErrorsSuppressed = true; 
    wb.Navigate(url); 
} 

private void WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    if((sender as WebBrowser).ReadyState == System.Windows.Forms.WebBrowserReadyState.Complete) 
    { 
     // Do what ever you want to do here when page is completely loaded. 
    } 
} 

我希望這可以幫助你在你的追求。

+1

我正好有這個實現,我的事件不會觸發。 我正在使用webbrowser進入STA後臺線程。 – 2013-05-21 18:59:36

+0

您不應在後臺線程中創建WebBrowser。您可以將其創建爲UI的一部分,或者在Form-Shown事件或類似的地方。祝你好運。 – Casperah 2013-05-21 20:58:16

+0

我需要它在後臺實例化。我使用它來呈現使用javascript/ajax呈現搜索結果的頁面,並且由於我提供了多線程性能,webbrowser msut將在bg線程中創建=/ – 2013-05-22 14:33:11

0

在你生成輸出窗口,查找以下警告:

如果您發現該警告,確保所有組件使用相同的「不同版本的同一依賴程序集的之間存在衝突」版本的衝突Referenced程序集,並在WebBrowser傳遞事件時重新檢查。