2010-11-17 121 views
1

我有下面的代碼,但是當我點擊網頁時,它會觸發2-6次。我怎麼才能讓它只發一次?C#webBrowser HTMLDoc.Click觸發多次,爲什麼?

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    if (webBrowser1.Document != null) 
    { 
     htmlDoc = webBrowser1.Document; 
     htmlDoc.Click += htmlDoc_Click; 
     //htmlDoc.MouseDown += htmlDoc_MouseDown; 
     //htmlDoc.MouseMove += htmlDoc_MouseMove; 
     htmlDoc.ContextMenuShowing += htmlDoc_ContextMenuShowing; 
    } 
} 

void htmlDoc_Click(object sender, HtmlElementEventArgs e) 
{ 
    Console.WriteLine("Mouse Click"); 
    if (e.CtrlKeyPressed) 
    { 
     if (webBrowser1.Document.GetElementFromPoint(e.ClientMousePosition).InnerHtml != null) 
     { 
     //MessageBox.Show(webBrowser1.Document.GetElementFromPoint(webBrowser1.PointToClient(MousePosition)).InnerText.ToString()); 
     Debug.WriteLine(webBrowser1.Document.GetElementFromPoint(e.ClientMousePosition).InnerHtml); 
     } 

     e.ReturnValue = false; 
     return; 
    } 

    // stop mouse events moving on to the HTML doc return false 
    e.ReturnValue = true; 
} 
+0

每次文檔加載時,您都會意識到您將註冊點擊事件......因此可能會創建您正在描述的內容。 – 2010-11-17 19:41:10

+0

是你的頁面被加載到WebBrowser控件坐在窗體上? – dexter 2010-11-17 19:42:34

+0

@ Max是的。 @Aaron謝謝我認爲你是正確的,但我不知道如何使它只在最後一個documentComplete上添加事件處理程序? – Adrian 2010-11-17 19:52:50

回答

3

如果您訪問的網頁包含框架,則DocumentCompleted事件將多次觸發,每個框架觸發一次。因此,您將多次訂閱活動。通過檢查e.Url.Equals(webBrowser1.Url)來過濾,最後一個是真的。

您必須解決的另一個問題是取消訂閱該事件,現在您將泄漏HtmlDocument。在調用Navigate()之前一定要取消訂閱。

0

你需要實現自己的Dispose方法,並從所有事件退訂有:

  htmlDoc.Click -= htmlDoc_Click; 

      htmlDoc.ContextMenuShowing -= htmlDoc_ContextMenuShowing; 

盧斯像你的變量是全局所以不應該是一個問題。

相關問題