2011-08-13 25 views
2

ナビゲーションフレームを使用してWPFアプリケーションを作成しています。私は、ページがロードされるのを待っている間にプログレスバーを表示しようとしています。 msdn pageサイス同様NavigationProgressにプログレスバーが表示されない

ナビゲーション:新しいナビゲーションが要求されたときに発生します。ナビゲーションをキャンセルするには を使用することができます。

NavigationProgress:ダウンロード中に定期的に発生し、 ナビゲーション進行状況の情報を提供します。

移動:ページが見つかってダウンロードされたときに発生します。

だから私はプログレス(navigationProgressBar)とグリッド(navigationStatusGrid)を持っていると私はフレーム(メインフレーム)を持っている

これらは私のイベントハンドラです:

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は読み込み中にフリーズします...ロードされたページだけをプログレスバーで見ることはできません。これをどうすれば解決できますか?

+0

何らかの理由で進行状況イベントが発生することもありません... –

+0

mainFrame.Source = new Uri( "Views/Home.xaml"、UriKind.Relative); ここで "Views/Home.xaml"は私が読み込んでいるページです。私のためにイベントを起動しますが、スレッドの問題がいくつかあると思います。ナビゲーションはUIなどと同じスレッドで行われます。 – VDP

+0

@VDP 2番目のページを読み込んでいる間にユーザーに進捗状況を示すための解決策が見つかりました –

答えて

0

ドキュメンテーションではナビゲーションが暗黙のうちに起こると主張していますが(Navigateメソッドを使用している場合)、アシンクロナスであると思われる部分だけを調べることはできません。

UIをフリーズする大きなXAMLがある場合、UIをフリーズする長い実行コンストラクタがあり、Webページに移動しても進行状況イベントは起動されません。

問題の原因となる別のスレッドでオブジェクトを非同期的に作成すると、コントロールがスレッドアフィンであるため、少なくとも一部は意味があります。長時間実行しているコンストラクターを使用している場合は、UIスレッドでコンストラクター自体を呼び出す必要があるため、ワークをスレッドに外部化する必要があります。

+0

新しいページへのナビゲーションを完了している間、適切な待機の進捗を実装するのにも苦労します。ページの読み込みの開始から終了までを示すプログレスバーを実装するための他の提案はありますか? –

+0

申し訳ありませんが、通常、フレームを使用しないでください。 –

関連する問題