2010-09-16 8 views
7

Ho creato un indicatore di occupato, in pratica un'animazione di un logo che gira. L'ho aggiunto a una finestra di accesso e associato la proprietà Visibility alla proprietà BusyIndicatorVisibility di viewmodel.Come posso forzare la visualizzazione dell'indicatore occupato? (WPF)

Quando faccio clic su login, voglio che lo spinner compaia mentre avviene il login (chiama un servizio web per determinare se le credenziali di accesso sono corrette). Tuttavia, quando imposto la visibilità su visibile, quindi proseguo con il login, lo spinner non appare fino al completamento del login. Nella codifica vecchio stile di Winform avrei aggiunto un'applicazione Application. Evento. Come posso far apparire lo spinner in WPF in un'applicazione MVVM?

Il codice è:

 private bool Login() 
     { 
      BusyIndicatorVisibility = Visibility.Visible; 
      var result = false; 
      var status = GetConnectionGenerator().Connect(_model); 
      if (status == ConnectionStatus.Successful) 
      { 
       result = true; 
      } 
      else if (status == ConnectionStatus.LoginFailure) 
      { 
       ShowError("Login Failed"); 
       Password = ""; 
      } 
      else 
      { 
       ShowError("Unknown User"); 
      } 
      BusyIndicatorVisibility = Visibility.Collapsed; 
      return result; 
     } 
+1

+1 per avermi fatto rabbrividire con un DoEvents ;-) – Stimul8d

risposta

8

dovete fare il vostro asincrona login. È possibile utilizzare BackgroundWorker per farlo. Qualcosa di simile:

BusyIndicatorVisibility = Visibility.Visible; 
// Disable here also your UI to not allow the user to do things that are not allowed during login-validation 
BackgroundWorker bgWorker = new BackgroundWorker() ; 
bgWorker.DoWork += (s, e) => { 
    e.Result=Login(); // Do the login. As an example, I return the login-validation-result over e.Result. 
}; 
bgWorker.RunWorkerCompleted += (s, e) => { 
    BusyIndicatorVisibility = Visibility.Collapsed; 
    // Enable here the UI 
    // You can get the login-result via the e.Result. Make sure to check also the e.Error for errors that happended during the login-operation 
}; 
bgWorker.RunWorkerAsync(); 

Solo per completezza: V'è la possibilità di dare l'interfaccia utente il tempo di aggiornamento entro il login avviene. Questo è fatto tramite il dispatcher. Comunque questo è un hack e IMO non dovrebbe mai essere usato. Ma se sei interessato a questo, puoi cercare StackOverflow per wpf doevents.

+0

Merda. Speravo che non fosse la risposta. Ho ereditato una grande applicazione con cose dell'interfaccia utente che si verificano dappertutto e ho un giorno per aggiungere questo indicatore occupato a circa 50 schermate. Non c'è un modo più semplice? – Unhappy

+0

L'altro problema è che l'ho provato sulla schermata di accesso e interrompe i test :( – Unhappy

+0

Forse qualcosa del genere: Nel metodo Login(), apri una finestra modale (window.ShowDialog) e fai il login lì dentro. Chiudi la finestra dopo che l'accesso è stato completato, quindi l'app è bloccata fino a quando l'accesso non è stato eseguito.La finestra stessa mostra che l'app è occupata.In finestra, vorrei usare BackgroundWorker. – HCL

0

Il codice di accesso viene eseguito sul thread dell'interfaccia utente? Questo potrebbe bloccare gli aggiornamenti dei database.

+0

Sì, sfortunatamente. – Unhappy

Problemi correlati