2

我正在为 IE(6+) 编写工具栏。我使用了来自

codeproject.com(http://www.codeproject.com/KB/dotnet/IE_toolbar.aspx),并有一个可以工作的工具栏,注册注销等。我想要工具栏做的是将html页面中的div突出显示为用户的鼠标移到该 div 上。到目前为止,突出显示代码有效,但我想在工具栏上的标签中显示 div 的名称(如果存在)(随着鼠标移动等而变化)。

我一辈子都无法做到这一点,尝试调试它是一场噩梦。由于程序集托管在 IE 中,我怀疑我通过尝试从未创建该控件的线程更新标签上的文本而导致异常(在 IE 中),但由于该异常发生在 IE 中,我没看到。

尝试使用 Invoke 以线程安全的方式更新控件的解决方案是什么?如果有怎么办?

这是事件代码:

private void Explorer_MouseOverEvent(mshtml.IHTMLEventObj e)
{
      mshtml.IHTMLDocument2 doc = this.Explorer.Document as IHTMLDocument2;
      element = doc.elementFromPoint(e.clientX, e.clientY);
      if (element.tagName.Equals("DIV", StringComparison.InvariantCultureIgnoreCase))
      {
          element.style.border = "thin solid blue;";
          if (element.className != null)
          {
               UpdateToolstrip(element.className);
          }
      } 
      e.returnValue = false;
}

这是对工具栏的线程安全更新的尝试:

delegate void UpdateToolstripDelegate(string text);

public void UpdateToolstrip(string text)
{
     if (this.toolStripLabel1.InvokeRequired == false)
     {
         this.toolStripLabel1.Text = text;
     }
     else
     {
         this.Invoke(new UpdateToolstripDelegate(UpdateToolstrip), new object[] { text });
     }
}

任何建议都非常感谢。

4

1 回答 1

1

我无法真正重现这个问题(为 IE 工具栏创建一个测试项目有点太多工作了),但你可以试试这个:

将以下例程添加到公共静态(扩展方法)类:

public static void Invoke(this Control control, MethodInvoker methodInvoker)
{
    if (control.InvokeRequired)
        control.Invoke(methodInvoker);
    else
        methodInvoker();
}

然后将第一个块中的类似代码部分替换为:

if (element.className != null)
{
    this.Invoke(() => toolStripLabel1.Text = element.className);
}

这是避免 UI 应用程序中的线程安全问题的可靠方法。

于 2008-10-28T20:08:19.840 回答