Question

J'écris une barre d'outils pour IE (6+). J'ai utilisé les différents exemples de barres de

codeproject.com ( http://www.codeproject.com/KB/dotnet /IE_toolbar.aspx ), et une barre d’outils qui fonctionne, enregistre les désinscriptions, etc. Ce que je veux que la barre d’outils fasse est de mettre en surbrillance les div dans une page html lorsque la souris de l’utilisateur se déplace sur cette div. Jusqu'ici, le code de surbrillance fonctionne, mais j'aimerais afficher le nom de la div (s'il existe) dans une étiquette de la barre d'outils (en changeant au fur et à mesure que la souris se déplace, etc.).

Je ne parviens pas à faire que cela se produise et essayer de le déboguer est un cauchemar. Comme l'assembly est hébergé dans IE, je suppose que je provoque une exception (dans IE) en essayant de mettre à jour le texte sur l'étiquette à partir d'un thread qui n'a pas créé ce contrôle, mais parce que cette exception se produit dans IE, ne le vois pas.

La solution est-elle d'essayer de mettre à jour le contrôle de manière thread-safe en utilisant Invoke? Si oui comment?

Voici le code de l'événement:

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

et voici une tentative de mise à jour thread-safe de la barre d’outils:

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

Toutes les suggestions sont très appréciées.

Était-ce utile?

La solution

Je ne peux pas vraiment reproduire le problème (créer un projet de test pour une barre d'outils IE est un peu trop de travail), mais vous pouvez essayer ceci:

Ajoutez la routine suivante à une classe publique statique (méthodes d'extensions):

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

Puis remplacez la section de code similaire dans le premier bloc par ceci:

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

C’est un moyen sûr d’éviter les problèmes de thread-safe dans les applications d’interface utilisateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top