2016-07-06 74 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