解决了,其实颜色是变了,因为属性值变了,需要强制让那个空间刷新,而不是Form刷新。
问题一、颜色改变问题:若想达到题目的目的,第一反应是将控件颜色改变,然后下一行就写延时,延时完做其它的动作。
如:
void Move(){
//移动一段距离
if(//到达边界条件){
//亮灯
panel.BackColor = Color.Yellow;
//延时一段时间
Thread.Sleep(300);
//执行其余动作
}
}
但是实际上,这样执行的时候,发现虽然panel.BackColor
的值是改变了,但是在执行Thread.Sleep(300)
期间,UI的显示上,根本没有控件颜色的改变。也就是说出现了:明明我改变了控件颜色呀,但是为什么显示上它却不变呢???
问题二、Timer问题:Timer的Enable属性并不是一打开就会开始计时,而是当执行timer1.Enable = true
这一行代码的方法执行结束后,才会开始执行触发。
问题一和二的答案是一致的:C#的作业系统,规定了一定要这行代码所在的方法执行结束以后,才会去实际做这个事情。
也就说,我们完全可以用别的方法来完成这件事情,来避开这个。
问题一解决方案:
首先有一个移动一次的方法,方法内同时会对亮灯进行判断以及到了边界改变方向。
void MoveOneTime()
{
for( int i = 0; i < m_PositionRodGroup.Length; i++ ) {
m_PositionRodGroup[ i ].Location = new Point( m_PositionRodGroup[ i ].Location.X,
m_PositionRodGroup[ i ].Location.Y + m_EachMoveDistance );
}
// check light on/off
if( m_PositionRodGroup[ 0 ].Location.Y == m_CylinderLocation.Y - 120 ) {
EventCenter.LihtOn( true, LightPosition.DOWN );
isStartSleep = true;
return;
}
else if( m_PositionRodGroup[ 0 ].Location.Y == m_CylinderLocation.Y - 30 ) {
EventCenter.LihtOn( true, LightPosition.UP );
m_EachMoveDistance = -1;
//m_tmr1.Enabled = false;
}
else {
EventCenter.LihtOn( false, LightPosition.DOWN );
}
}
然后让Timer挂载的方法来触发MoveOneTime
,而延时的方法则写在m_tmr1_Tick
中,通过一个bool的isStartSleep
字段来控制是否延时。
void m_tmr1_Tick( object sender, EventArgs e )
{
if( isStartSleep ) {
System.Threading.Thread.Sleep( m_nStandingTime * 500 );
m_EachMoveDistance = 1;
isStartSleep = false;
}
MoveOneTime();
}