Pergunta

Eu estou escrevendo uma barra de ferramentas para o IE (6+). Eu tenho usado os vários bares amostra de

codeproject.com ( http://www.codeproject.com/KB/dotnet /IE_toolbar.aspx ), e tem uma barra de ferramentas que funciona, registros cancela o registro etc. o que eu quero a barra de ferramentas para fazer é divs destaque dentro de uma página html como movimentos do mouse dos usuários mais que div. Até agora, o código funciona destacando, mas eu gostaria de exibir o nome da div (se existir) em uma etiqueta na barra de ferramentas (mudando à medida que o mouse se move etc).

Não consigo para a vida de me entender isso acontecer e tentando depurar é um pesadelo. À medida que a montagem está hospedado no IE, eu suspeito que eu estou fazendo uma exceção (no IE) ao tentar atualizar o texto no rótulo de um segmento que não criar esse controle, mas porque essa exceção está acontecendo no IE, eu não vê-lo.

é a solução para tentar atualizar o controle de uma forma thread-safe usando Invoke? Se sim, como?

Aqui está o código de 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;
}

e aqui é uma tentativa de atualização thread-safe da barra de ferramentas:

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

Todas as sugestões muito apreciada.

Foi útil?

Solução

Eu realmente não posso reproduzir o problema (criando um projeto de teste para um IE barra de ferramentas é um pouco muito trabalho), mas você pode tentar o seguinte:

Adicione a seguinte rotina a um public static (extensões métodos) Classe:

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

E, em seguida, substituir a seção de código semelhante no primeiro bloco com este:

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

Esta é uma maneira infalível de evitar problemas thread-safe em aplicações de interface do usuário.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top