2016-07-06 6 views
1

Ich habe ein MVVM C# -Projekt, das über eine Schaltfläche in einem Formular verfügt, das einige Verarbeitung durchführt. Es dauert ein paar Sekunden, um die Verarbeitung durchzuführen, und das ist in Ordnung. Es gibt ein zugeordnetes Textfeld, in dem ich die Hintergrundfarbe während der Verarbeitung ändern möchte. Ich habe versucht, dies ohne Erfolg zu tun.Ändern der TextBox-Farbe in einer Methode

Ich habe die Hintergrundfarbe für das Textfeld, das an eine Eigenschaft gebunden ist, die ich am Anfang der Methode ändere, die von der Schaltfläche aufgerufen wird (über eine Befehlsbindung). Die Methode führt die Arbeit durch und setzt dann die Hintergrundfarbe auf die Standardfarbe zurück. Wenn Sie auf die Schaltfläche klicken, wird keine Änderung auf dem Bildschirm angezeigt.

Ich habe versucht, den Farbwechsel-Code in einen Dispatcher zu setzen, um es auf dem GUI-Thread zu erreichen, aber das funktioniert immer noch nicht.

Ich bin jetzt verwirrt. Wie kann ich die Farbe richtig ändern?

private void SwitchRuns() 
    { 
     try 
     { 

      // Bound property (set up with Notification correctly) 
      // 
      CurRunTextBoxColor = Colors.Red; 

      UIServices.SetBusyState(true); // sets cursor to wait 

      ... 
      Processing code 
      ... 

      CurRunTextBoxColor = Colors.LightGreen; 

     } 
     catch (Exception exp) 
     { 
      log.Error("Exception in SwitchRuns" + exp); 
     } 
    } 
+0

Was die Bindung aussehen wie für den Hintergrund Ihrer TextBox tut? – Bijington

+1

Blockierst du den Gui-Thread während der Codeverarbeitung? – lokusking

Antwort

0

Was ich glaube, geschieht, ist Ihr SwitchRuns Verfahren direkt aus dem UI-Thread aufgerufen wird und damit die UI-Thread ist besetzt. Durch Drücken der Betrieb in einem Hintergrund-Thread sollte das Problem lösen:

private void SwitchRuns() 
{ 
    ThreadPool.QueueUserWorkItem((o) => this.SwitchRuns()); 
} 

private void SwitchRunsAsync() 
{ 
    // Bound property (set up with Notification correctly) 
    // 
    this.Dispatcher.BeginInvoke((Action)(() => 
    { 
     CurRunTextBoxColor = Brushes.Red; 
    }), DispatcherPriority.Send); 

    // Place your load logic here in place of the sleep. 
    Thread.Sleep(2000); 

    this.Dispatcher.BeginInvoke((Action)(() => 
    { 
     CurRunTextBoxColor = Brushes.LightGreen; 
    }), DispatcherPriority.Send); 
} 

Bitte beachten Sie, dass ich die Bindung an die Background Eigentum Ihrer CurRunTextBoxColor Eigenschaft geändert ein Brush und kein Color sein, um auch zu bekommen a TextBox zu arbeiten.

0

Statt CurRunTextBoxColor = Colors.Red;

schreiben: this.Dispatcher.Invoke(() => { myTextBox.Background = Brushes.Red });

+0

Das OP hat angegeben, dass dies eine MVVM-Anwendung ist. – Bijington