2013-07-22 3 views
14

Ich habe eine Aktualisierungsschaltfläche in meiner App, die einige asynchrone Methoden verwendet, um die Liste der angezeigten Elemente zu aktualisieren. Das Problem ist, dass ich keinen Rückgabetyp von Task für den Ereignishandler für den Button-Klick haben kann, so dass mir eine asynchrone Void-Methode verbleibt. Somit kann der Benutzer die Aktualisierungsschaltfläche drücken und dann ein Element auswählen, während die Liste neu gefüllt wird, was zu einem Fehler führen wird.Ist es möglich, während eines Tastendrucks asynchrone Aufgaben abzuwarten?

Start Code, die Griffe Schaltfläche klicken:

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


     await ViewModel.CreateMessageCommand(); 

So gibt es sowieso richtig zu warten für diese Aufgabe zu beenden?

Antwort

18

Da Ereignishandler für Steuerelemente normalerweise void zurückgeben, müssen Sie dies auf andere Weise behandeln. Dies bedeutet oft, in einem Szenario wie bei Ihnen, dass Sie alle oder einen Teil Ihrer UI deaktivieren müssen, während die Dinge werden geladen, das heißt:

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

Sie sollten einfach alle der Benutzeroberfläche deaktivieren steuert, dass der Benutzer nicht Interaktion mit zu Beginn der Aktion, und aktivieren Sie sie dann am Ende.

1

Eine Möglichkeit wäre, den Blick in einem BusyIndicator einzuwickeln vom WPF Toolkit

Sie würden eine Bool-Eigenschaft auf Ihrem Ansichtsmodell bieten und den Wert am Anfang und Ende wechseln.

Es stellt ein UI-Element über allen anderen Steuerelementen auf, das Benutzerinteraktion verhindert, aber eine animierte ausgelastete Nachricht bereitstellt, die aktualisiert werden kann, um zu sagen, was auch immer Sie wünschen.

+0

Funktioniert dies für Windows Store-Apps? – Orch

+0

Ich sehe nicht, warum es nicht sollte. Es sei denn, sie beschränken, welche Bibliotheken des 3. Teils Sie verwenden können. – ywm

+2

Sie können WPF-Steuerelemente in Windows Store-Apps nicht verwenden. Andere Plattform, obwohl immer noch Xaml. Sie benötigen einen 3rd Party Busy Indicator Port (oder schreiben Sie Ihren eigenen) –