WebBrowser文档已完成事件C#

cpr*_*gcr 3 c# webbrowser-control

下面是我用作浏览器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");

}
Run Code Online (Sandbox Code Playgroud)

现在wbrowser.Navigate("http://www.google.com");执行此行后,会有一个消息框正确显示该URL,然后一段时间后,另一个消息框显示相同的URL.所以,发生的事情是,DocumentCompleted事件处理程序上的任何内容都会被执行两次.有人可以帮助我让它只执行一次吗?

Jud*_*ngo 7

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

如果您只想要一次接收事件,只需取消订阅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");
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用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");
}
Run Code Online (Sandbox Code Playgroud)