WebBrowser 文档完成事件 C#

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11763189/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 19:08:06  来源:igfitidea点击:

WebBrowser Document Completed Event C#

c#webbrowser-control

提问by cprogcr

Below is the function I use as my browsers' DocumentCompletedevent, and also the navBtnClick()method which is responsible for creating the web browser and navigating to a specific url.

下面是我用作浏览器DocumentCompleted事件的函数,以及navBtnClick()负责创建 Web 浏览器和导航到特定 url 的方法。

public void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {

                MessageBox.Show( ((WebBrowser)sender).Url.ToString() );

}



private void navBtnClick(object sender, EventArgs e)
{
            WebBrowser wbrowser = new WebBrowser();
            wbrowser.DocumentCompleted +=new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
            wbrowser.Navigate("http://www.google.com");

}

Now after this line wbrowser.Navigate("http://www.google.com");is executed, there is a message box correctly showing the url, and then after a while another message box shows with the same url. So, what happens is, whatever is on the DocumentCompletedevent handler, gets executed twice. Can someone help me make it execute once only?

现在在wbrowser.Navigate("http://www.google.com");执行此行后,有一个消息框正确显示了 url,然后过了一会儿另一个消息框显示了相同的 url。所以,发生的事情是,无论DocumentCompleted事件处理程序上有什么,都会被执行两次。有人可以帮我让它只执行一次吗?

采纳答案by Judah Gabriel Himango

As I recall, DocumentCompleted will fire multiple times if the document being navigated to has iframes that embed other web pages.

我记得,如果要导航到的文档具有嵌入其他网页的 iframe,则 DocumentCompleted 将触发多次。

If you only want to receive the event exactly once, just unsubscribe from the DocumentCompleted handler:

如果您只想接收该事件一次,只需取消订阅 DocumentCompleted 处理程序:

public void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{
   var webBrowser = sender as WebBrowser;
   webBrowser.DocumentCompleted -= WebBrowser_DocumentCompleted;
   MessageBox.Show(webBrowser.Url.ToString() );
}    

private void navBtnClick(object sender, EventArgs e)
{
     var wbrowser = new WebBrowser();
     wbrowser.DocumentCompleted +=new WebBrowserDocumentCompletedEventHandler(WebBrowser_DocumentCompleted);
     wbrowser.Navigate("http://www.google.com");
}


Alternately, you can use System.IObservable and ReactiveExtensionsto subscribe to exactly one event firing:

或者,您可以使用 System.IObservable 和ReactiveExtensions来订阅一个事件触发:

private void navBtnClick(object sender, EventArgs e)
{
     var browser = new WebBrowser();
     var docCompleted = Observable.FromEventPattern<WebBrowserDocumentCompletedEventArgs>(browser, "DocumentCompleted")
     docCompleted
         .Take(1) // Take only one event firing
         .Subscribe(i => MessageBox.Show(browser.Url.ToString()));

     browser.Navigate("http://www.google.com");
}

回答by Peter Ritchie

For me, http://www.google.comredirects to http://www.google.ca. If something similar happens for you, they you may be getting a document completed event for each of those two documents. Try outputting/tracing WebBrowserDocumentCompletedEventArgs.Urlto see what document was completed.

对我来说,http://www.google.com重定向到http://www.google.ca。如果类似的事情发生在您身上,您可能会收到这两个文档中每一个的文档完成事件。尝试输出/跟踪WebBrowserDocumentCompletedEventArgs.Url以查看完成的文档。