Frage

Ich schreibe eine Toolbar für den IE (6+). Ich habe die verschiedenen Probenstäbe aus

verwendet

codeproject.com ( http://www.codeproject.com/KB/dotnet /IE_toolbar.aspx ) und eine Symbolleiste, das funktioniert, registriert hebt die Registrierung etc. Was ich die Symbolleiste innerhalb einer hTML-Seite wie der Benutzer die Maus bewegt sich über dieses div markieren divs tun möchten, ist. Bisher ist die Hervorhebung Code funktioniert, aber ich möchte den Namen des div angezeigt werden (falls vorhanden) in einem Etikett auf der Symbolleiste (ändern, wie die Maus bewegt usw.).

Ich kann nicht für das Leben von mir bekommen dies geschehen kann und versucht, es zu debuggen ist ein Alptraum. Wenn die Anordnung in IE gehostet wird, vermute ich, dass ich eine Ausnahme bin verursacht (in IE), indem Sie versuchen, den Text auf dem Etikett von einem Thread zu aktualisieren, die nicht, dass die Kontrolle erstellt haben, sondern weil diese Ausnahme in IE geschieht, ich sieht es nicht.

Ist die Lösung zu versuchen, die Kontrolle in einem Thread-sichere Art und Weise zu aktualisieren, mit Invoke? Wenn ja, wie?

Hier ist der Ereigniscode:

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

und hier ist ein Versuch, Thread-sichere Aktualisierung der Symbolleiste:

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

Irgendwelche Vorschläge sehr geschätzt.

War es hilfreich?

Lösung

Ich kann nicht wirklich das Problem reproduzieren (ein Testprojekt für eine IE-Toolbar schaffen, ist ein bisschen zu viel Arbeit), aber man kann versuchen, diese:

Fügen Sie die folgende Routine zu einem öffentlichen statischen (Erweiterungen Methoden) Klasse:

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

Und dann ersetzen Sie den Abschnitt von ähnlichem Code in dem ersten Block mit diesem:

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

Dies ist ein sicherer Weg, Thread-sichere Probleme in UI-Anwendungen zu vermeiden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top