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事件处理程序上的任何内容都会被执行两次.有人可以帮助我让它只执行一次吗?
我记得,如果导航到的文档具有嵌入其他网页的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)