2016-07-06 72 views
1

我有一個MVVM C#項目,它在表單上有一個按鈕,用於執行一些處理。 這需要幾秒鐘的時間來處理,這很好。有一個相關的文本框,我想在處理過程中更改背景顏色。我一直在試圖做到這一點,但沒有成功。更改方法中的TextBox顏色

我有綁定到屬性的背景顏色,我改變了按鈕調用的方法的開始(通過命令綁定)。該方法完成該工作,然後將背景顏色設置回其默認顏色。單擊按鈕時屏幕上不會發生變化。

我已經嘗試將顏色更改代碼放入Dispatcher中,以使其發生在GUI線程上,但這仍然無效。

我現在很困惑。如何正確更改顏色?

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

什麼的結合看起來像你的文本框的背景是什麼? – Bijington

+1

在進行代碼處理時,您是否阻止了Gui線程? – lokusking

回答

0

我認爲正在發生的事情是你SwitchRuns方法是直接從UI線程調用,因此在UI線程繁忙。按下操作成爲後臺線程要解決的問題:

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); 
} 

請注意,我也改變了你的CurRunTextBoxColor特性,在以獲得結合的Background財產Brush而不是Color一個TextBox工作。

0

而不是CurRunTextBoxColor = Colors.Red;

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

+0

OP確實聲明這是一個MVVM應用程序。 – Bijington