В основном у меня та же проблема, что и у этого пользователя:
Как проверить скольжение TrackBar при удержании и отпускании мыши
Я исправил это, используя первое предоставленное решение. Тем не менее, когда вызывается таймер, я хочу вызвать InvokeScript для элемента управления веб-браузера. InvokeScript работает без ошибок, но функция javascript никогда не вызывается. Когда я вызываю этот скрипт из обработчика событий, подобного нажатой кнопке, функция вызывается правильно.
Я обнаружил, что при попытке доступа к свойствам из элемента управления веб-браузера (например, MessageBox.Show (webBrowser1.DocumentText) это вызывает исключение InvalidCastException.
// in constructor:
webBrowser1.AllowWebBrowserDrop = false;
webBrowser1.IsWebBrowserContextMenuEnabled = false;
webBrowser1.WebBrowserShortcutsEnabled = false;
webBrowser1.ObjectForScripting = this;
timer = new System.Threading.Timer(this.TimerElapsed);
private void trackBar2_ValueChanged(object sender, EventArgs e)
{
timer.Change(500, -1);
}
private void TimerElapsed(object state)
{
this.webBrowser1.InvokeScript("jmp_end");
MessageBox.Show(this.webBrowser1.DocumentText);
timerRunning = false;
}
private void TimerElapsed(object state)
{
WebBrowser brw = getBrowser();
brw.Document.InvokeScript("jmpend");
MessageBox.Show(brw.DocumentText);
timerRunning = false;
}
Кто-нибудь знает, что я здесь не так делаю? Или есть другой способ получить тот же результат?
После комментариев о InvokeRequired это звучит именно так, как мне нужно ... Но я не могу заставить его работать ... Это то, что я сделал из примера кода из C # System.InvalidCastException
public delegate WebBrowser getBrowserHandler();
public WebBrowser getBrowser()
{
if (InvokeRequired)
{
return Invoke(new getBrowserHandler(getBrowser)) as WebBrowser;
}
else
{
return webBrowser1;
}
}
private void TimerElapsed(object state)
{
WebBrowser brw = getBrowser();
brw.Document.InvokeScript("jmpend");
MessageBox.Show(brw.DocumentText);
timerRunning = false;
}
Что я здесь пропустил?