我有下面的代码但是当我点击网页时它会触发2到6次。怎么才能让它一下子开火?
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 :(得分:3)
如果您访问的网页包含框架,则DocumentCompleted事件将多次触发,每帧一次。因此,您将多次订阅该活动。通过检查e.Url.Equals(webBrowser1.Url)来过滤它,它只适用于最后一个。
您需要解决的另一个问题是取消订阅该事件,此时您将泄漏HtmlDocument。在调用Navigate()之前一定要取消订阅。
答案 1 :(得分:0)
您需要实现自己的Dispose方法并在所有事件中取消订阅:
htmlDoc.Click -= htmlDoc_Click;
htmlDoc.ContextMenuShowing -= htmlDoc_ContextMenuShowing;
像你的变量这样的Loos是全局的,所以不应该是一个问题。