A Enfiar Possível / COM / problema UI
-
04-07-2019 - |
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.
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.