我想在文档完全加载后做一些事情...我不想使用WebBrowser.DocumentCompleted事件,所以请不要建议我这样做。
我尝试了两种方法,但它们不起作用。有人能告诉我我做错了吗?
示例1
wb.Navigate("http://www.google.com");
while(wb.ReadyState != WebBrowserReadyState.Complete) { }
richtextdocument.Text = wb.DocumentText;
示例2
wb.Navigate("http://www.google.com");
while(wb.isBusy == true) { }
richtextdocument.Text = wb.DocumentText;
答案 0 :(得分:1)
尝试使用计时器来验证文档加载状态。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
if(webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
timer1.Enabled = false;
richTextBox1.Text = webBrowser1.DocumentText;
}
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Enabled = true;
webBrowser1.Navigate("http://www.google.com");
}
}
答案 1 :(得分:0)
你在这里处理的是试图同步调用一个固有的异步方法。
正如您在问题评论中提到的那样,不使用DocumentCompleted
的原因是您需要将该事件用于其他目的,我建议您使用DocumentCompleted
事件,加上私有类布尔标志,以确定这是否是DocumentCompleted
的特殊情况。
private bool wbNeedsSpecialAction; //when you need to call the special case of Navigate() set this flag to true
public Form1()
{
InitializeComponent();
wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
}
void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
if (wbNeedsSpecialAction)
{
richtextdocument.Text = wb.DocumentText;
wbNeedsSpecialAction = false;
}
else
{
//other cases of using DocumentCompleted...
}
}
public void Browse()
{
wbNeedsSpecialAction = true; //make sure the event is treated differently
wb.Navigate("http://www.google.com");
}
这仍然允许您控制事件处理程序中的其他情况。
您必须特别注意确保您的用户在此“特殊操作”页面完成加载之前无法再触发Navigate()
,否则可能窃取特殊情况事件。一种方法是在页面完成加载之前阻止UI,例如:
Cursor.Current = Cursors.WaitCursor;
答案 2 :(得分:0)
while(wb.ReadyState != WebBrowserReadyState.Complete) {application.doevents }