NavigationProgress не показывает индикатор выполнения - PullRequest
2 голосов
/ 13 августа 2011

Я пишу приложение WPF, используя фрейм навигации. Я пытаюсь отобразить индикатор выполнения во время ожидания загрузки страницы.

Как и на странице msdn sais:

Навигация: Происходит при запросе новой навигации. Может быть использован для отменить навигацию.

NavigationProgress: периодически происходит во время загрузки, чтобы обеспечить информация о ходе навигации.

Навигация: Происходит, когда страница была найдена и загружена.

Итак, у меня есть Grid (navigationStatusGrid) с ProgressBar (navigationProgressBar) и у меня есть кадр (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

Итак, вы бы сказали, что это работает, но каким-то образом интерфейс обновляется только при загрузке страницы. Пользовательский интерфейс даже зависает при загрузке ... Я не вижу индикатор выполнения только мгновенно загруженной страницы. Как мне это решить?

1 Ответ

0 голосов
/ 13 августа 2011

Событие progress мне кажется довольно бесполезным, хотя в документации утверждается, что навигация происходит ненормально (если вы используете метод Navigate), я не могу понять, какая его часть должна быть асинхронной.

Если у вас большой XAML, который замораживает пользовательский интерфейс, если у вас есть долго работающий конструктор, который также замораживает пользовательский интерфейс, и если вы переходите на веб-страницу, событие progress даже не запускается.

По крайней мере, некоторые из них имеют смысл, поскольку элементы управления являются потоковыми, если объект должен был быть создан асинхронно в другом потоке, что могло бы вызвать проблемы. Если у вас есть долго работающий конструктор, вам нужно локально перенести работу в поток, так как сам конструктор должен вызываться в потоке пользовательского интерфейса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...