Domanda

Sto scrivendo una barra degli strumenti per IE (6+). Ho usato le varie barre di esempio da

codeproject.com ( http://www.codeproject.com/KB/dotnet /IE_toolbar.aspx ) e dispone di una barra degli strumenti che funziona, registra le registrazioni non registrate, ecc. Quello che voglio fare sulla barra degli strumenti è evidenziare div all'interno di una pagina html mentre il mouse degli utenti si sposta su quel div. Finora il codice di evidenziazione funziona, ma vorrei visualizzare il nome del div (se esiste) in un'etichetta sulla barra degli strumenti (cambiando man mano che si sposta il mouse, ecc.)

Non riesco a far sì che la vita di me accada e provare a eseguire il debug è un incubo. Poiché l'assembly è ospitato in IE, sospetto che stia causando un'eccezione (in IE), provando ad aggiornare il testo sull'etichetta da un thread che non ha creato quel controllo, ma poiché tale eccezione si sta verificando in IE, I non vederlo.

È la soluzione per provare ad aggiornare il controllo in modo thread-safe usando Invoke? Se sì, come?

Ecco il codice 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;
}

ed ecco un tentativo di aggiornamento thread-safe della barra degli strumenti:

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

Qualche suggerimento molto apprezzato.

È stato utile?

Soluzione

Non riesco davvero a riprodurre il problema (la creazione di un progetto di test per una barra degli strumenti di IE è un po 'troppo impegnativa), ma puoi provare questo:

Aggiungi la seguente routine a una classe pubblica statica (metodi di estensione):

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

E quindi sostituisci la sezione di codice simile nel primo blocco con questo:

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

Questo è un modo sicuro per evitare problemi di thread-safe nelle applicazioni dell'interfaccia utente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top