NavigationProgress不显示进度条

时间:2011-08-13 12:36:27

标签: c# wpf multithreading navigation

我正在使用导航框架编写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只在页面加载时才会更新。用户界面甚至在加载时冻结......我没有立即看到进度条加载的页面。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

进度事件对我来说似乎毫无用处,而文档声称导航是偶然发生的(如果你使用Navigate方法)我无法弄清楚它的哪一部分应该是同步的。

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

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