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甚至会在加载时冻结……我不能在加载页面的瞬间看到进度条。怎么解呢?
进度事件对我来说似乎相当无用,而文档声称导航是异步发生的(如果您使用Navigate
方法),我无法确定它的哪一部分应该是异步的。
如果你有一个大型的XAML会冻结UI,如果你有一个长时间运行的构造函数也会冻结UI,如果你导航到一个网页,进度事件甚至不会触发。
至少其中一些是有意义的,因为控件是线程无关的,如果对象是在不同的线程上异步创建的,这将导致问题。如果你有一个长时间运行的构造函数,你需要将工作外部化到本地线程,因为构造函数本身需要在ui线程上调用。