Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在web浏览器加载到WPF时显示进度条_C#_Wpf_Multithreading_Progress Bar - Fatal编程技术网

C# 在web浏览器加载到WPF时显示进度条

C# 在web浏览器加载到WPF时显示进度条,c#,wpf,multithreading,progress-bar,C#,Wpf,Multithreading,Progress Bar,我已经环顾了四周,但我很难找到实现以下目标的方法: 我有一个WPF应用程序,它有一个web浏览器控件。我在磁盘上保存了一个文件,我正在使用Navigate方法加载该文件 我在web浏览器LoadCompleted事件中附加了一个事件处理程序,这可以正常工作 但是,加载页面可能需要很长时间。我想显示一个进度条(理想情况下是在状态栏中,但一个新窗口是可以的),但我找不到任何方法来实现这一点 我尝试过的每一件事(后台工作人员、线程)都说调用线程必须是STA,而作为UI元素的进度条似乎只能在UI线程上更

我已经环顾了四周,但我很难找到实现以下目标的方法:

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

我在web浏览器LoadCompleted事件中附加了一个事件处理程序,这可以正常工作

但是,加载页面可能需要很长时间。我想显示一个进度条(理想情况下是在状态栏中,但一个新窗口是可以的),但我找不到任何方法来实现这一点

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

或者,是否有方法在新线程中运行web浏览器控件?我猜不是因为这也是一个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(文件名));?这可能是最简单的方法。