我有一个MVVM C#项目,它在表单上有一个按钮,可以进行一些处理。 这需要几秒钟来完成处理,那很好。有一个关联的文本框,我想在处理过程中更改背景颜色。我一直试图这样做但没有成功。
我有文本框的背景颜色绑定到我在按钮调用的方法的开头更改的属性(通过命令绑定)。该方法完成工作,然后将背景颜色设置回其默认颜色。单击按钮时,屏幕上不会发生任何变化。
我已经尝试将颜色更改代码放在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 :(得分: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 属性更改为Brush
而不是Color
,以便绑定到Background
属性TextBox
工作。
答案 1 :(得分:0)
而不是CurRunTextBoxColor = Colors.Red;
写:this.Dispatcher.Invoke(() => { myTextBox.Background = Brushes.Red });