在我的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;
}
甚至可能吗?
答案 0 :(得分: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()。 ChangeColour将每秒执行一次。
答案 1 :(得分:0)
你要求DateTime.Now方式太快,所以差异将等于0,因为DateTime的准确度不会达到纳秒(毕竟日期从unix时期标记为毫秒)
您可能希望使用更加可靠的逻辑来限制while。
答案 2 :(得分:0)
尝试使用DispatcherTimer以异步方式执行操作。
在方法执行期间,UI不会更新,而且如果您在UI线程中工作。