您的位置:首页 > 编程语言 > C#

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

2020-02-02 09:07 579 查看

解决了,其实颜色是变了,因为属性值变了,需要强制让那个空间刷新,而不是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();
}
  • 点赞
  • 收藏
  • 分享
  • 文章举报
桃花换小鱼干儿 发布了84 篇原创文章 · 获赞 3 · 访问量 3364 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐