2013-03-12 130 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传递事件时重新检查。

相关问题