【问题标题】:Display a progress bar whilst the web browser is loading in WPF在 WPF 中加载 Web 浏览器时显示进度条
【发布时间】:2014-05-03 06:57:05
【问题描述】:

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

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

我有一个附加到 Web 浏览器 LoadCompleted 事件的事件处理程序,这很有效。

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

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

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

任何帮助将不胜感激。

附言进度条是一个简单的不确定条;我没有尝试更新状态 - 只是在加载页面时显示。

【问题讨论】:

  • 不是数据的下载问题; Web 浏览器控件会阻止线程,直到它下载数据并显示它。作为 html,这可能会导致其他项目,例如图像和 javascript/css。

标签: c# wpf multithreading progress-bar


【解决方案1】:

所有 UI 控件都将坚持它们仅由 UI 线程更新。这在 WinForms 和 WPF 中都是标准的。在 WPF 中,此线程编组是使用 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
}

【讨论】:

  • 我不想从另一个线程更新。目前我有一个线程,但进度条在网络浏览器工作时停止。我正在尝试将进度条或 Web 浏览器控件移动到不同的线程,以便进度条可以更新。我可能不清楚的一件事是,当我看到更新进度条时,我的意思是重绘,因为它在 Web 浏览器呈现页面时停止/暂停。
  • 那么我建议在一个线程上运行 WebBrowser Navigation,并在另一个线程上任意更新进度条,并在 WebBrowser.LoadCompleted 事件触发时完成进度。
  • 您有任何关于如何在单独的线程上运行导航的示例吗?目前我的代码只是 WebBrowser.Navigate(fileName);
  • 我尝试了*.com/questions/8645926/… 的答案 - 但这似乎仍然存在同样的问题。 Web 浏览器会加载,但它会阻止重绘进度条。
  • 你试过 WebBrowser.Dispatcher.BeginInvoke(() => WebBrowser.Navigate(filename)); 吗?这可能是最简单的方法。
最近更新 更多