3

以下は、ブラウザーの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");

}

この行wbrowser.Navigate("http://www.google.com");が実行された後、URLを正しく表示するメッセージボックスが表示され、しばらくすると、同じURLで別のメッセージボックスが表示されます。つまり、DocumentCompletedイベントハンドラーにあるものはすべて、2回実行されます。誰かが私にそれを一度だけ実行させるのを手伝ってもらえますか?

4

2 に答える 2

7

私が覚えているように、ナビゲート先のドキュメントに他のWebページを埋め込むiframeがある場合、DocumentCompletedは複数回起動します。

イベントを1回だけ受信したい場合は、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");
}

または、System.IObservableとReactiveExtensionsを使用して、次の1つのイベント発生をサブスクライブできます。

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");
}
于 2012-08-01T16:35:19.970 に答える
1

私の場合、 http://www.google.comはhttp://www.google.caにリダイレクトします。同様のことが発生した場合は、これら2つのドキュメントのそれぞれについてドキュメント完了イベントが発生している可能性があります。出力/トレースWebBrowserDocumentCompletedEventArgs.Urlして、どのドキュメントが完成したかを確認してください。

于 2012-08-01T16:31:43.950 に答える