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]…所以我认为并发性不会是一个问题…
这是因为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;
}