2013-07-22 32 views
14

Tôi có nút làm mới trong ứng dụng sử dụng một số phương pháp không đồng bộ để cập nhật danh sách các mục được hiển thị. Vấn đề là tôi không thể có một kiểu trả về của Task cho trình xử lý sự kiện cho nút bấm, vì vậy tôi bị bỏ lại với một phương thức void async. Vì vậy, người dùng có thể nhấn nút làm mới, sau đó chọn một mục trong khi danh sách đang được repopulated mà sẽ dẫn đến một lỗi.Có thể đợi các tác vụ không đồng bộ trong khi nhấp vào nút không?

bắt đầu của mã để xử lý nút bấm:

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


     await ViewModel.CreateMessageCommand(); 

Vì vậy, là có anyway để đúng cách chờ đợi cho nhiệm vụ này để kết thúc?

Trả lời

18

Vì trình xử lý sự kiện cho các điều khiển thường trả về void, bạn cần xử lý điều này theo cách khác. Điều này thường có nghĩa là, trong một kịch bản như của bạn, mà bạn cần phải vô hiệu hóa toàn bộ hoặc một phần của giao diện người dùng của bạn trong khi mọi thứ được tải, ví dụ:

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

Bạn chỉ nên vô hiệu hóa tất cả các giao diện người dùng điều khiển mà người sử dụng không nên tương tác với lúc bắt đầu hành động và sau đó bật chúng ở cuối.

1

Một cách sẽ được quấn Xem trong một BusyIndicator từ WPF Toolkit

Bạn sẽ cung cấp một tài sản bool trên viewmodel của bạn và chuyển đổi giá trị khi bắt đầu và kết thúc.

Thiết lập phần tử giao diện người dùng phía trên tất cả các điều khiển khác ngăn chặn tương tác của người dùng nhưng cung cấp thông báo bận rộn động, có thể được cập nhật để nói bất cứ điều gì bạn muốn.

+0

Tính năng này có hoạt động đối với cửa sổ lưu trữ ứng dụng không? – Orch

+0

Tôi không hiểu tại sao nó không nên. Trừ khi chúng hạn chế những thư viện thứ 3 mà bạn có thể sử dụng. – ywm

+2

Bạn không thể sử dụng các điều khiển WPF trong các ứng dụng Windows Store. Nền tảng khác nhau, mặc dù vẫn là Xaml. Bạn sẽ cần một cổng chỉ báo bận rộn bên thứ 3 (hoặc viết của riêng bạn) –

Các vấn đề liên quan