2013-07-22 16 views
14

いくつかの非同期メソッドを使用して表示されたアイテムのリストを更新する、私のアプリケーションにリフレッシュボタンがあります。問題は、ボタンのクリックに対するイベントハンドラの戻り値のタイプのTaskを持てないため、非同期voidメソッドが残っていることです。したがって、ユーザは、リフレッシュボタンを押すことができ、リストが再投入されている間にアイテムを選択することができ、これによりエラーが生じる。ボタンのクリックを処理するコードのボタンクリック中に非同期タスクを待つことはできますか?

開始:

private async void Button_Click_1(object sender, RoutedEventArgs e) 
    { 


     await ViewModel.CreateMessageCommand(); 

だから、きちんと仕上げるには、このタスクのために待つためにとにかくはありますか?

答えて

18

コントロールのイベントハンドラは通常voidを返しますので、これを別の方法で処理する必要があります。これは、多くの場合、つまり、物事がロードしている間、あなたはUIの全部または一部を無効にする必要があることを、あなたのようなシナリオでは、意味:

private async void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    // Make the "list" disabled, so the user can't "select an item" and cause an error, etc 
    DisableUI(); 

    try 
    {  
     // Run your operation asynchronously 
     await ViewModel.CreateMessageCommand(); 
    } 
    finally 
    { 
     EnableUI(); // Re-enable everything after the above completes 
    } 
} 
2

あなたは単にUIのすべてのユーザーがないことを制御し無効にする必要がありますアクションの開始時に対話してから、最後に有効にします。

1

一つの方法は、あなたがあなたのviewmodel上のブールプロパティを提供するWPF Toolkit

からBusyIndi​​catorで表示をラップし、開始と終了時の値を切り替えることであろう。

これは、他のすべてのコントロールの上にUI要素を配置し、ユーザーの操作を妨げますが、アニメートされたビジーメッセージを提供します。

+0

Windowsの場合、これはアプリを保存しますか? – Orch

+0

私はそれがしてはならない理由は見ません。彼らが使用できる第3の部分ライブラリを制限しない限り。 – ywm

+2

WindowsストアアプリケーションでWPFコントロールを使用することはできません。別のプラットフォーム、まだXamlですが。サードパーティのビジーインジケータポートが必要です(または自分で書いてください) –

関連する問題