我的应用中有一个刷新按钮,它使用一些异步方法来更新显示的项目列表。问题是我不能为按钮单击的事件处理程序提供返回类型的任务,所以我留下了一个异步void方法。因此,用户可以点击刷新按钮,然后在重新填充列表时选择一个项目,这将导致错误。
开始处理按钮点击的代码:
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
await ViewModel.CreateMessageCommand();
那么无论如何都要正确地等待这项任务完成?
答案 0 :(得分:21)
由于控件的事件处理程序通常返回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
}
}
答案 1 :(得分:2)
您应该只是禁用用户在操作开始时不应与之交互的所有UI控件,然后在最后启用它们。
答案 2 :(得分:1)
一种方法是从WPF Toolkit
中包装BusyIndicator中的View您可以在viewmodel上提供bool属性,并在开头和结尾切换值。
它在所有其他控件上方放置了一个UI元素,阻止了用户交互,但提供了一个动画忙碌消息,可以更新为您想要的任何内容。