NullReferenceException with System.Windows.Controls.WebBrows

本文关键字:Controls WebBrows Windows System with NullReferenceException | 更新日期: 2023-09-27 18:15:14

我有一个c# WPF应用程序,它带有一个名为wB的web浏览器控件(System.Windows.Controls.WebBrowser)。它应该显示一个本地html文件,并从中解析一些信息。

我得到一个NullReferenceException,因为它说身体是空的最后一行(IHTMLElementCollection data = hDoc.body.children as IHTMLElementCollection)与以下代码:

wB.Navigate(new Uri(file, UriKind.Absolute));                
HTMLDocument hDoc = (HTMLDocumentClass)wB.Document;
IHTMLElementCollection data = hDoc.body.children as IHTMLElementCollection;

如果我这样做

wB.Navigate(new Uri(file, UriKind.Absolute));                
HTMLDocument hDoc = (HTMLDocumentClass)wB.Document;
System.Windows.MessageBox.Show("Loc:" + hDoc.url);
IHTMLElementCollection data = hDoc.body.children as IHTMLElementCollection;

一切正常。为什么body在第一个例子中显示为null,但在第二个例子中显示为fine ?

Edit1 该方法被标记为[STAThread]…所以我认为并发性不会是一个问题…

NullReferenceException with System.Windows.Controls.WebBrows

这是因为Navigate()方法是异步的-在第二个示例中,您确认MessageBox的时间刚好足够它完成,因此它可以工作-尽管不可靠。

相反,您应该订阅DocumentCompleted事件并在回调中进行数据收集。

你应该使用

wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);

所以你可以确定文档已经加载了:

private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
  WebBrowser wb = sender as WebBrowser;
  HTMLDocument hDoc = (HTMLDocumentClass)wB.Document;
  IHTMLElementCollection data = hDoc.body.children as IHTMLElementCollection;
}