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

一种方法是将视图包装在WPF 工具包中的 BusyIndi​​cator 中

您将在视图模型上提供一个 bool 属性并在开始和结束时切换值。

它在所有其他控件之上放置了一个 UI 元素,以防止用户交互,但提供动画繁忙消息,可以更新以说出你想要的任何内容。

于 2013-07-22T16:33:33.823 回答