1

在我的 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;
 }

甚至可能吗?

4

3 回答 3

1

看起来你的循环太紧了。

试试这个:

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 将每秒执行一次。

于 2013-01-25T16:18:47.820 回答
0

尝试使用DispatcherTimer以异步方式执行。

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

于 2013-01-25T16:19:10.677 回答
0

您要求 DateTime.Now 太快了,因此差异将等于 0,因为 DateTime 的准确度没有达到纳秒(毕竟日期是从 unix 纪元开始以毫秒为单位标记的)。

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

于 2013-01-25T16:15:34.460 回答