Pregunta

Estoy escribiendo una barra de herramientas para IE (6+). He utilizado las diferentes barras de muestra de

codeproject.com ( http://www.codeproject.com/KB/dotnet /IE_toolbar.aspx ), y tiene una barra de herramientas que funciona, registra los registros, etc. Lo que quiero que haga la barra de herramientas es resaltar divs dentro de una página html a medida que el mouse del usuario se mueve sobre ese div. Hasta el momento, el código de resaltado funciona, pero me gustaría mostrar el nombre del div (si existe) en una etiqueta en la barra de herramientas (cambiar a medida que el mouse se mueve, etc.).

Por mi vida, no puedo hacer que esto suceda y tratar de corregir errores es una pesadilla. Como el ensamblaje está alojado en IE, sospecho que estoy causando una excepción (en IE) al intentar actualizar el texto en la etiqueta desde un hilo que no creó ese control, pero debido a que esa excepción está ocurriendo en IE, no lo veas

¿La solución para intentar actualizar el control de forma segura para subprocesos es usar Invoke? Si es así, ¿cómo?

Aquí está el código del evento:

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;
}

y aquí hay un intento de actualización segura de subprocesos de la barra de herramientas:

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 });
     }
}

Cualquier sugerencia muy apreciada.

¿Fue útil?

Solución

Realmente no puedo reproducir el problema (crear un proyecto de prueba para una barra de herramientas de IE es demasiado trabajo), pero puedes intentar esto:

Agregue la siguiente rutina a una clase pública estática (métodos de extensiones):

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

Y luego reemplace la sección de código similar en el primer bloque con esto:

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

Esta es una forma segura de evitar los problemas de seguridad de subprocesos en las aplicaciones de IU.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top