1

我想在文档完全加载后做一些事情......我不想使用 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;
4

3 回答 3

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");
        }
    }
于 2012-09-10T07:08:08.313 回答
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;
于 2012-09-10T07:14:00.023 回答
0
while(wb.ReadyState != WebBrowserReadyState.Complete) {application.doevents }
于 2012-09-25T14:18:28.210 回答