2016-04-14 6 views
1

メソッド呼び出し中にプログレスバーを表示したい。私はこのチケットに示唆しているようにそれを処理しました:ProgressBar button doesn't show while service call in windows store appWindowsストアアプリケーションでProgressBarを管理するためにawaitメソッドでイベント発生を処理する方法は?

現在のイベントの内部を呼び出すイベントを待つことはありません。 すなわち

public async void navigationHelper_LoadState(object sender, LoadStateEventArgs e) 
{ 
    loading.Visibility = Windows.UI.Xaml.Visibility.Visible; 
    await initializeThePage(); 
    loading.Visibility = Windows.UI.Xaml.Visibility.Collapsed; 
} 

//following method doesn't wait for SelectionChanged event. It should wait 
private async Task initializeThePage() 
{ 
    //few service call here 
    cmdStore.SelectedIndex = 1;  //this should wait until cmdStore_SelectionChanged complete its call 
} 

private async void cmdStore_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    //few service call here 
    loading.Visibility = Windows.UI.Xaml.Visibility.Visible; 
    await getOrderlistAccordingToStore(storeID);   //get store details 
    loading.Visibility = Windows.UI.Xaml.Visibility.Collapsed; 
} 

public async Task getOrderlistAccordingToStore(int storeID) 
{ 
    //calls of get orderlist according to selected store 
} 

ときcmdStore.SelectedIndex = 1;呼び出し、それがcmdStore_SelectionChangedメソッドを呼び出します。この場合、await initializeThePage();cmdStore_SelectionChangedが完了するまで待つ必要があります。しかし、このイベントを待つことはなく、次回の実行を継続します。

現在の電話を待っているイベントを処理する方法を教えてください。

+0

'cmdStore.SelectedIndex = 1;を設定した後、' SelectedIndex'に依存する 'initializeThePage'の中に何かがありますか? –

+0

@AdnanUmerいいえ、 'cmdStore.SelectedIndex' called.cmdStore.SelectedIndex = 1;'呼び出しの後には何も依存しません。コールはストアデータを取得し、画面にデータを表示します。 –

答えて

1

cmdStore_SelectionChangedはイベントハンドラにバインドされ、async voidです。このメソッドの実行が完了するのを直接待つことはできません

これを処理するには、いくつかの回避策を実行できます。まず、ローダーを表示/非表示するヘルパーメソッドを導入します。

int waitCounter = 0; 
void ShowLoader() 
{ 
    waitCounter += 1; 
    if (waitCounter > 1) // Already loader is visible 
     return; 

    loading.Visibility = Windows.UI.Xaml.Visibility.Visible; 
} 

void HideLoader() 
{ 
    waitCounter -= 1; 

    if (waitCounter <= 0) // No more call to wait for 
     loading.Visibility = Windows.UI.Xaml.Visibility.Collapsed; 
} 

はその後表示されます。この

public async void navigationHelper_LoadState(object sender, LoadStateEventArgs e) 
{ 
    ShowLoader() 
    await initializeThePage(); 
    HideLoader() 
} 

private async Task initializeThePage() 
{ 
    //few service call here 
    cmdStore.SelectedIndex = 1; 
} 

private async void cmdStore_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ShowLoader(); 
    //few service call here 
    await getOrderlistAccordingToStore(storeID);   //get store details 
    HideLoader(); 
} 

public async Task getOrderlistAccordingToStore(int storeID) 
{ 
    //calls of get orderlist according to selected store 
} 

ページが最初に初期化されたローダーのように見えるためにあなたの実装を変更し、両方cmdStore_SelectionChangedinitializeThePageがその実行を完了すると消えます。

関連する問題