2014-03-25 62 views
0

我已经环顾四周,但我很难找到一种方式来实现以下:显示进度条,而网络浏览器加载在WPF

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

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

但是,页面可能需要很长时间才能加载。我想显示一个进度条(最好在状态栏中,但是新窗口没问题),但我无法找到这样做。

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

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

任何帮助,将不胜感激。

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

+0

http://msdn.microsoft.com/en-us/library/ms144190.aspx – Paparazzi

+0

这并不是说是数据的下载问题; Web浏览器控件会阻塞该线程,直到它下载并显示数据。而且,这可能会导致其他项目,如图像和JavaScript/CSS。 –

回答

0

所有UI控件都会坚持只通过UI线程更新它们。这在WinForms和WPF中都是标准的。在WPF中,这个线程编组是使用Dispatcher完成的,最好是用于创建控件的一个,但如果对控件的引用不可用(比如说,在MVVM环境中,应用程序调度程序将会很好。)

从使用分派另一个线程更新一个UI元素通常的模式是

private void UpdateStatusBar(int progress) 
{ 
    if (!Application.Current.Dispatcher.CheckAccess()) 
    { 
     Application.Current.Dispatcher.Invoke(() => UpdateStatusBar(progress)); 
     return; 
    } 

    // update status here 
} 
+0

我不想从另一个线程进行更新。目前我有一个线程,但进度条在Web浏览器正在工作时停止。我正在尝试将进度条或网页浏览器控件移到不同的线程,以便进度条可以更新。有一件事我可能不清楚的是当我看到更新进度条时,我的意思是重绘,因为它在Web浏览器呈现页面时停止/暂停。 –

+0

然后我建议在一个线程上运行WebBrowser导航,并随意更新另一个线程上的进度条,并在WebBrowser.LoadCompleted事件触发时完成进度。 –

+0

您是否有任何有关如何在单独线程上运行导航的示例?目前我的代码只是WebBrowser.Navigate(fileName); –

相关问题