NullReferenceException с System.Windows.Controls.WebBrowser WPF - PullRequest
1 голос
/ 21 ноября 2011

У меня есть приложение C # WPF с элементом управления веб-браузера (System.Windows.Controls.WebBrowser), которое называется wB.Он должен отображать локальный 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;

Все работает нормально.Почему тело показывает нулевое значение в первом примере, но хорошо для второго?

Edit1 Метод помечен как [STAThread] ... поэтому я подумал, что параллелизм не будетвопрос ...

Ответы [ 2 ]

4 голосов
/ 21 ноября 2011

Это потому, что метод Navigate() является асинхронным - во втором примере вы подтверждаете, что MessageBox является достаточным временем для его завершения, поэтому он работает - хотя ненадежно.

Вместо этого вы должны подписаться наDocumentCompleted событие и выполните сбор данных в обратном вызове.

3 голосов
/ 21 ноября 2011

Вы должны использовать

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;
}
...