您尝试访问尚未加载的文档,因为您在导航到新 Uri 后立即访问该Document
属性,这就是您获得NullReferenceException
.
您需要使用该WebBrowser.DocumentCompleted
事件。
该事件何时被触发?
从 MSDN 中,只要设置了以下属性之一或调用了方法之一,WebBrowser
控件就会导航到新文档:Url、DocumentText、DocumentStream、Navigate、GoBack、GoForward、GoHome、GoSearch。
导航将按此顺序触发以下事件:
Navigating
事件:
处理导航事件以在导航开始之前接收通知。如果未满足某些条件(例如,当用户未完全填写表单时),处理此事件可让您取消导航。
Navigated
事件:
当 WebBrowser 控件完成导航并开始在新位置加载文档时,处理 Navigated 事件以接收通知。
DocumentCompleted
事件:
处理 DocumentCompleted 事件以在新文档完成加载时接收通知。当 DocumentCompleted 事件发生时,新文档已完全加载,这意味着您可以通过 Document、DocumentText 或 DocumentStream 属性访问其内容。
我的控件不可见。它不应该被用户使用。我只是想从代码隐藏中加载一个文档
控件不可见的事实应该不是问题。我已经webbrowser
在运行时创建了一个我没有添加到表单中的测试(参见下面的示例),并且该事件仍然被引发。
它是如何被激活的?
这是一个可能的实现:
private WebBrowser wb;
private void Button1_Click(System.Object sender, System.EventArgs e)
{
if (wb == null) {
wb = new WebBrowser();
wb.DocumentCompleted += wb_DocumentCompleted;
}
wb.Navigate("YourPath");
}
private void wb_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
{
IO.File.WriteAllText(IO.Path.Combine(Application.StartupPath, "Test.html"), wb.Document.Body.Parent.OuterHtml, System.Text.Encoding.GetEncoding(wb.Document.Encoding));
}
另请参阅此线程我可以使用 for 循环等待网络浏览器完成导航吗?