C#培训2019-10-25 关于延时与Timer的问题 (改变控件颜色后,让其保持这个颜色一段时间,而实际运行颜色根本没有变)

解决了,其实颜色是变了,因为属性值变了,需要强制让那个空间刷新,而不是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();
		}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值