16

アプリに更新ボタンがあり、非同期メソッドを使用して表示される項目のリストを更新します。問題は、ボタン クリックのイベント ハンドラーの戻り値の型を Task にすることができないため、async void メソッドが残っていることです。したがって、ユーザーは更新ボタンを押して、リストが再作成されている間にアイテムを選択すると、エラーが発生します。

ボタンのクリックを処理するコードの開始:

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


        await ViewModel.CreateMessageCommand();

とにかく、このタスクが完了するのを適切に待つ方法はありますか?

4

3 に答える 3

23

通常、コントロールのイベント ハンドラーは を返すため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
    }
}
于 2013-07-22T16:32:19.070 に答える
2

アクションの開始時にユーザーが操作してはならない UI コントロールをすべて無効にし、最後に有効にする必要があります。

于 2013-07-22T16:32:25.790 に答える
1

1 つの方法は、 WPF ツールキットの BusyIndi​​cator で View をラップすることです。

ビューモデルに bool プロパティを提供し、開始と終了で値を切り替えます。

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

于 2013-07-22T16:33:33.823 に答える