我环顾四周,但我很难找到实施以下方法的方法:
我有一个带有Web浏览器控件的WPF应用程序。我有一个保存在磁盘上的文件,我正在使用Navigate方法加载文件。
我有一个附加到Web浏览器LoadCompleted事件的事件处理程序,这可以工作。
但是,页面可能需要很长时间才能加载。我想显示一个进度条(理想情况是在状态栏中,但是新窗口是可以的),但无论如何我都无法找到它。
我尝试的每一件事(后台工作者,线程)都说调用线程必须是STA,并且似乎进度条,即UI元素,只能在UI线程上更新 - 这被阻塞了在呈现页面期间的Web浏览器控件。
或者有没有办法在新线程中运行Web浏览器控件?我猜不是因为这也是一个UI元素。
任何帮助都将不胜感激。
P.S。进度条是一个简单的不确定条;我不是要更新状态 - 只是在加载页面时显示。
答案 0 :(得分:0)
所有UI控件都会坚持只有UI线程才能更新它们。这是WinForms和WPF的标准。在WPF中,此线程编组是使用Dispatcher完成的,最好是用于创建控件的Dispatcher,但是如果对控件的引用不可用(例如,在MVVM环境中,Application Dispatcher会正常运行。)
使用Dispatcher从另一个线程更新UI元素的常用模式是
private void UpdateStatusBar(int progress)
{
if (!Application.Current.Dispatcher.CheckAccess())
{
Application.Current.Dispatcher.Invoke(() => UpdateStatusBar(progress));
return;
}
// update status here
}