C# 动态更改背景颜色

C# 动态更改背景颜色,c#,windows-phone-7,background,brush,C#,Windows Phone 7,Background,Brush,在我的Windows Phone 7应用程序中,我希望ContentPanel的背景在指定时间内(本例中为3秒)更改其颜色。基本上我希望它是“闪烁的” 但问题是,在循环工作时不会出现更改,在循环工作完成后,颜色只更改一次。为什么? byte R; TimeSpan ts = new System.TimeSpan(0, 0, 0, 3); DateTime dt1 = new DateTime(); DateTime dt2 = new DateTime(); r

在我的Windows Phone 7应用程序中,我希望
ContentPanel
的背景在指定时间内(本例中为3秒)更改其颜色。基本上我希望它是“闪烁的”

但问题是,在循环工作时不会出现更改,在循环工作完成后,颜色只更改一次。为什么?

byte R;
TimeSpan ts = new System.TimeSpan(0, 0, 0, 3);
DateTime dt1 = new DateTime();           
DateTime dt2 = new DateTime();    

requirement = true;
while (requirement)
{ 
    R = Convert.ToByte(0.5 * 255 * (1 + Math.Sin(DateTime.Now.Millisecond)));
    ContentPanel.Background = new SolidColorBrush(Color.FromArgb(255, R, 125, 70));
    dt1 = DateTime.Now;
    dt2 = DateTime.Now;
    dt2.Subtract(dt1);
    if (dt2.Subtract(ts).CompareTo(dt1) > 0) requirement = false;
 }

甚至有可能吗?

您要求的是DateTime。现在速度太快了,所以差值将等于0,因为DateTime的精度不到纳秒(毕竟,从unix纪元开始,日期以毫秒标记)


您可能希望使用更可靠的逻辑来限制while。

您要求的是DateTime。现在速度太快了,因此差值将等于0,因为DateTime的精度不会达到纳秒(日期毕竟是从unix纪元以毫秒标记的)


您可能希望使用更可靠的逻辑来限制while。

看起来您的循环太紧了

请尝试以下方法:

private DispatcherTimer _timer;

private void StartFlash()
{
  _timer = new DispatcherTimer();
  _timer.Interval = new TimeSpan(0,0,1);
  _timer.Tick += (s,e) => ChangeColour;
}

private void StopFlash()
{
  _timer = null;
}

private void ChangeColour() {
  // Your colour changing logic goes here
  ContentPanel.Background = new SolidColorBrush(Color.FromArgb(a,r,g,b));
}

把代码放到一个类中。在某处调用StartFlash()。ChangeColor将每秒执行一次。

看起来您的循环太紧了

请尝试以下方法:

private DispatcherTimer _timer;

private void StartFlash()
{
  _timer = new DispatcherTimer();
  _timer.Interval = new TimeSpan(0,0,1);
  _timer.Tick += (s,e) => ChangeColour;
}

private void StopFlash()
{
  _timer = null;
}

private void ChangeColour() {
  // Your colour changing logic goes here
  ContentPanel.Background = new SolidColorBrush(Color.FromArgb(a,r,g,b));
}
把代码放到一个类中。在某处调用StartFlash()。ChangeColor将每秒执行一次。

尝试以异步方式使用to do

在方法执行期间,UI不会更新,而且如果您在UI线程中工作。

尝试以异步方式使用to do


在方法执行期间,UI不会更新,而且如果您在UI线程中工作。

在获取
dt1
dt2
之间,尝试添加对
thread.sleep()的调用。
在获取
dt1
dt2
之间,此解决方案也不起作用。不过,感谢您的努力。此解决方案也不起作用。谢谢你的努力。