2013-07-22 12 views
14

Mam przycisk odświeżania w mojej aplikacji, który korzysta z niektórych metod asynchronicznych, aby zaktualizować listę wyświetlanych elementów. Problem polega na tym, że nie mogę mieć typu Zwróć zadanie dla obsługi zdarzenia dla kliknięcia przycisku, więc pozostawiam asynchroniczną metodę void. W ten sposób użytkownik może nacisnąć przycisk odświeżania, a następnie wybrać element, gdy lista jest ponownie wypełniana, co spowoduje błąd.Czy można oczekiwać zadań asynchronicznych podczas kliknięcia przycisku?

początek kodu, który obsługuje kliknięcie przycisku:

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


     await ViewModel.CreateMessageCommand(); 

Więc czy jest tak właściwie czekają na to zadanie do końca?

Odpowiedz

18

Ponieważ procedury obsługi zdarzeń dla kontrolek zwykle zwracają void, należy postępować z nimi w inny sposób. Oznacza to często, w scenariuszu, jak twoje, że trzeba wyłączyć wszystkie lub część swojej UI podczas ładowania rzeczy, czyli:

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

Należy po prostu wyłączyć wszystkie UI kontroluje, że użytkownik nie powinien interakcji z na początku akcji, a następnie włączyć je na końcu.

1

Jednym ze sposobów byłoby zawinąć View w BusyIndicator z WPF Toolkit

byłoby podać właściwość bool na swoim viewmodel i ustawić wartość na początku i na końcu.

Umieszcza element interfejsu użytkownika nad wszystkimi pozostałymi elementami sterującymi, które uniemożliwiają interakcję użytkownika, ale dostarczają animowaną wiadomość zajętą, która może być aktualizowana, aby powiedzieć, co chcesz.

+0

Czy to działa dla aplikacji sklepu Windows? – Orch

+0

Nie rozumiem, dlaczego nie powinien. Chyba, że ​​ograniczą to, które biblioteki trzeciej części możesz użyć. – ywm

+2

Nie można używać elementów sterujących WPF w aplikacjach Windows Store. Inna platforma, choć nadal Xaml. Potrzebny byłby port wskaźnika zajętości innej firmy (lub napisanie własnego). –

Powiązane problemy