Пишу панель инструментов для IE (6+). Я использовал различные образцы из
codeproject.com (http://www.codeproject.com/KB/dotnet/IE_toolbar.aspx) и имеет панель инструментов, которая работает, регистрирует и отменяет регистрацию и т. д. Я хочу, чтобы панель инструментов выделяла элементы div на странице html, когда курсор пользователя перемещается по этому div. Пока что код выделения работает, но я хотел бы отобразить имя div (если он существует) в метке на панели инструментов (изменяется при перемещении мыши и т. д.).
Я не могу этого добиться, и попытки отладить это - кошмар. Поскольку сборка размещена в IE, я подозреваю, что вызываю исключение (в IE), пытаясь обновить текст на этикетке из потока, который не создавал этот элемент управления, но поскольку это исключение происходит в IE, я не вижу этого.
Есть ли решение попробовать обновить элемент управления поточно-ориентированным способом с помощью Invoke? Если да, то как?
Вот код события:
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;
}
и вот попытка поточно-безопасного обновления панели инструментов:
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 });
}
}
Любые предложения очень ценятся.





Я не могу воспроизвести проблему (создание тестового проекта для панели инструментов IE - это слишком много работы), но вы можете попробовать следующее:
Добавьте следующую процедуру в общедоступный статический класс (методы расширения):
public static void Invoke(this Control control, MethodInvoker methodInvoker)
{
if (control.InvokeRequired)
control.Invoke(methodInvoker);
else
methodInvoker();
}
А затем замените часть аналогичного кода в первом блоке следующим:
if (element.className != null)
{
this.Invoke(() => toolStripLabel1.Text = element.className);
}
Это верный способ избежать проблем с потокобезопасностью в UI-приложениях.