ボタンのクリック中に非同期タスクを待つことは可能ですか?
アプリに更新ボタンがあり、いくつかの非同期メソッドを使用して、表示されているアイテムのリストを更新しています。問題は、ボタンクリックのイベントハンドラーに戻り値の型のタスクを設定できないため、asyncvoidメソッドが残っていることです。したがって、ユーザーは更新ボタンを押してから、リストの再入力中にアイテムを選択すると、エラーが発生します。
ボタンクリックを処理するコードの開始:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
await ViewModel.CreateMessageCommand();
それで、とにかくこのタスクが完了するのを適切に待つことはありますか?
コントロールのイベントハンドラーは通常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
}
}
アクションの開始時にユーザーが操作してはならないすべてのUIコントロールを無効にし、最後に有効にする必要があります。
1つの方法は、ビューを WPF Toolkit からBusyIndicatorでラップすることです。
ビューモデルにboolプロパティを指定し、開始時と終了時に値を切り替えます。
UI要素を他のすべてのコントロールの上に配置して、ユーザーの操作を防ぎますが、アニメーションのビジーメッセージを提供します。このメッセージは、更新して好きなように言うことができます。