我正在使用导航框架编写WPF应用程序。我正在尝试在等待加载页面时显示进度条。
与msdn page sais一样:
导航:请求新导航时发生。可以用来 取消导航。
NavigationProgress:在下载过程中定期发生提供 导航进度信息。
导航:找到并下载页面时发生。
所以我有一个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只在页面加载时才会更新。用户界面甚至在加载时冻结......我没有立即看到进度条加载的页面。我该如何解决这个问题?
答案 0 :(得分:0)
进度事件对我来说似乎毫无用处,而文档声称导航是偶然发生的(如果你使用Navigate
方法)我无法弄清楚它的哪一部分应该是同步的。
如果你有一个大的XAML会冻结UI,如果你有一个长时间运行的构造函数也会冻结UI,如果你导航到一个web页面,甚至不会触发progress事件。
至少有一些是有意义的,因为控件是线程,如果要在不同的线程上异步创建对象会导致问题。如果你有一个长期运行的构造函数,你需要在本地将工作外部化到一个线程,因为构造函数本身需要在UI线程上调用。