NavigationProgress没有显示进度条

本文关键字:显示 NavigationProgress | 更新日期: 2023-09-27 18:05:22

我正在编写一个使用导航框架的WPF应用程序。我试图在等待加载页面时显示进度条。

就像msdn页面说的:

Navigating:在请求新的导航时发生。可以用来取消导航

NavigationProgress:在下载期间定期发生,以提供导航进度信息。

Navigated:当页面已被定位并下载时发生。

我有一个Grid (navigationStatusGrid)和ProgressBar (navigationProgressBar)我有一个Frame (mainFrame)

这些是我的事件处理程序:

private void mainFrame_NavigationProgress(object sender, NavigationProgressEventArgs e)
{
     long progress = e.BytesRead * 100 / e.MaxBytes;
     Console.WriteLine("Navigating progress:" + progress + "%");
     navigationProgressBar.Value = progress;
}
private void mainFrame_Navigating(object sender, NavigatingCancelEventArgs e)
{
     Console.WriteLine("start navigating");
     mainFrame.Visibility = Visibility.Hidden;
     navigationStatusGrid.Visibility= Visibility.Visible;
}
private void mainFrame_Navigated(object sender, NavigationEventArgs e)
{
     Console.WriteLine("end navigating");
     mainFrame.Visibility = Visibility.Visible;
     navigationStatusGrid.Visibility = Visibility.Hidden;
}

这是我的输出:

start navigating
Navigating progress:4%
Navigating progress:8%
...
Navigating progress:87%
Navigating progress:92%
Navigating progress:96%
Navigating progress:99%
Navigating progress:100%
Navigating progress:100%
end navigating

所以你会说它工作,但不知何故,UI只在页面加载时更新。UI甚至会在加载时冻结……我不能在加载页面的瞬间看到进度条。怎么解呢?

NavigationProgress没有显示进度条

进度事件对我来说似乎相当无用,而文档声称导航是异步发生的(如果您使用Navigate方法),我无法确定它的哪一部分应该是异步的。

如果你有一个大型的XAML会冻结UI,如果你有一个长时间运行的构造函数也会冻结UI,如果你导航到一个网页,进度事件甚至不会触发。

至少其中一些是有意义的,因为控件是线程无关的,如果对象是在不同的线程上异步创建的,这将导致问题。如果你有一个长时间运行的构造函数,你需要将工作外部化到本地线程,因为构造函数本身需要在ui线程上调用。