首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# webBrowser HTMLDoc.Click会多次触发,为什么?

C# webBrowser HTMLDoc.Click会多次触发,为什么?
EN

Stack Overflow用户
提问于 2010-11-18 03:35:53
回答 2查看 1.8K关注 0票数 1

我有下面的代码,但当我点击网页时,它会触发2-6次。我怎么才能让它只开一次火呢?

代码语言:javascript
复制
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;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-18 04:01:17

如果您访问的网页包含框架,则DocumentCompleted事件将多次触发,每个框架一次。因此,您将多次订阅该事件。通过检查e.Url.Equals(webBrowser1.Url)来过滤它,它只对最后一个是真的。

你必须解决的另一个问题是取消订阅事件,现在你会泄露HtmlDocument。在调用Navigate()之前,请确保取消订阅。

票数 3
EN

Stack Overflow用户

发布于 2010-11-18 03:45:34

您需要实现自己的Dispose方法,并在那里取消订阅所有事件:

代码语言:javascript
复制
            htmlDoc.Click -= htmlDoc_Click;

            htmlDoc.ContextMenuShowing -= htmlDoc_ContextMenuShowing;

像你的变量一样的Loos是全局的,所以不应该成为问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4208378

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档