2013-07-22 19 views
14

Nella mia app ho un pulsante di aggiornamento che utilizza alcuni metodi asincroni per aggiornare l'elenco degli elementi visualizzati. Il problema è che non posso avere un tipo di operazione di ritorno per il gestore di eventi per il clic del pulsante, quindi mi rimane un metodo di annullamento asincrono. Pertanto, l'utente può premere il pulsante di aggiornamento, quindi selezionare un elemento mentre l'elenco viene ripopolato, il che si tradurrà in un errore.È possibile attendere attività asincrone durante un clic del pulsante?

inizio del codice che gestisce scatto del tasto:

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


     await ViewModel.CreateMessageCommand(); 

Quindi c'è comunque correttamente attendono per questo compito per finire?

risposta

18

Poiché i gestori di eventi per i controlli in genere restituiscono void, è necessario gestirli in un modo diverso. Questo spesso significa, in uno scenario come la tua, che è necessario disabilitare tutto o in parte l'interfaccia utente, mentre le cose stanno caricando, vale a dire:

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

Si dovrà semplicemente disabilitare tutti i controlli UI che l'utente non deve interagire con all'inizio dell'azione e quindi abilitarli alla fine.

1

Un modo potrebbe essere quello di avvolgere la vista in un BusyIndicator dal WPF Toolkit

Si potrebbe fornire una proprietà bool sul tuo ViewModel e alternare il valore a inizio e fine.

Mette su un elemento dell'interfaccia utente sopra tutti gli altri controlli che impediscono l'interazione dell'utente, ma fornisce un messaggio animato occupato, che può essere aggiornato per dire tutto ciò che si desidera.

+0

Funziona per le app di Windows Store? – Orch

+0

Non vedo perché non dovrebbe. A meno che non limitino le librerie di terze parti che è possibile utilizzare. – ywm

+2

Non è possibile utilizzare i controlli WPF nelle app di Windows Store. Piattaforma diversa, anche se ancora Xaml. Avresti bisogno di una porta indicatore di occupato di terze parti (o scrivi la tua) –

Problemi correlati