C# 在web浏览器加载到WPF时显示进度条
我已经环顾了四周,但我很难找到实现以下目标的方法: 我有一个WPF应用程序,它有一个web浏览器控件。我在磁盘上保存了一个文件,我正在使用Navigate方法加载该文件 我在web浏览器LoadCompleted事件中附加了一个事件处理程序,这可以正常工作 但是,加载页面可能需要很长时间。我想显示一个进度条(理想情况下是在状态栏中,但一个新窗口是可以的),但我找不到任何方法来实现这一点 我尝试过的每一件事(后台工作人员、线程)都说调用线程必须是STA,而作为UI元素的进度条似乎只能在UI线程上更新,而UI线程在呈现页面时被web浏览器控件阻止 或者,是否有方法在新线程中运行web浏览器控件?我猜不是因为这也是一个UI元素 任何帮助都将不胜感激C# 在web浏览器加载到WPF时显示进度条,c#,wpf,multithreading,progress-bar,C#,Wpf,Multithreading,Progress Bar,我已经环顾了四周,但我很难找到实现以下目标的方法: 我有一个WPF应用程序,它有一个web浏览器控件。我在磁盘上保存了一个文件,我正在使用Navigate方法加载该文件 我在web浏览器LoadCompleted事件中附加了一个事件处理程序,这可以正常工作 但是,加载页面可能需要很长时间。我想显示一个进度条(理想情况下是在状态栏中,但一个新窗口是可以的),但我找不到任何方法来实现这一点 我尝试过的每一件事(后台工作人员、线程)都说调用线程必须是STA,而作为UI元素的进度条似乎只能在UI线程上更
p、 进度条是一个简单的不确定条;我没有试图更新状态-只是在加载页面时显示。所有UI控件都会坚持只通过UI线程更新它们。这在WinForms和WPF中都是标准的。在WPF中,此线程编组是使用调度程序完成的,最好是用于创建控件的调度程序,但如果控件的引用不可用(比如说,在MVVM环境中,应用程序调度程序会很好) 使用Dispatcher从另一个线程更新UI元素的常见模式是
private void UpdateStatusBar(int progress)
{
if (!Application.Current.Dispatcher.CheckAccess())
{
Application.Current.Dispatcher.Invoke(() => UpdateStatusBar(progress));
return;
}
// update status here
}
问题不在于下载数据;web浏览器控件将阻止线程,直到它下载并显示数据。作为html,这可能会导致其他项目,如图像和javascript/css。我不想从另一个线程更新。目前我只有一个线程,但是当web浏览器正在工作时,进度条停止了。我正在尝试将进度条或web浏览器控件移动到其他线程,以便进度条可以更新。有一件事我可能不太清楚,当我看到更新进度条时,我是说重新绘制,当web浏览器呈现页面时,它停止/暂停。然后我建议在一个线程上运行WebBrowser导航,在另一个线程上任意更新进度栏,并在触发WebBrowser.LoadCompleted事件时完成进度。您有任何关于如何在单独线程上运行导航的示例吗?目前我的代码只是WebBrowser.Navigate(文件名);我尝试了来自的答案,但这似乎仍然有同样的问题。web浏览器会加载,但在加载时会阻止重新绘制进度条。是否尝试过WebBrowser.Dispatcher.BeginInvoke(()=>WebBrowser.Navigate(文件名));?这可能是最简单的方法。