在WPF中加载Web浏览器时显示进度条

时间:2014-03-25 12:22:18

标签: c# wpf multithreading progress-bar

我环顾四周,但我很难找到实施以下方法的方法:

我有一个带有Web浏览器控件的WPF应用程序。我有一个保存在磁盘上的文件,我正在使用Navigate方法加载文件。

我有一个附加到Web浏览器LoadCompleted事件的事件处理程序,这可以工作。

但是,页面可能需要很长时间才能加载。我想显示一个进度条(理想情况是在状态栏中,但是新窗口是可以的),但无论如何我都无法找到它。

我尝试的每一件事(后台工作者,线程)都说调用线程必须是STA,并且似乎进度条,即UI元素,只能在UI线程上更新 - 这被阻塞了在呈现页面期间的Web浏览器控件。

或者有没有办法在新线程中运行Web浏览器控件?我猜不是因为这也是一个UI元素。

任何帮助都将不胜感激。

P.S。进度条是一个简单的不确定条;我不是要更新状态 - 只是在加载页面时显示。

1 个答案:

答案 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
}