c# - 当我释放按钮时,如何让我的 While 循环退出/中断?
问题描述
这里有什么问题?为什么 while 循环需要完成才能获得 keyup 事件,即使我已经发布了它..
我知道它只是暂时的,因为如果我只使用文本框,keyIsDown 在我释放按钮之前不会改变值。
void KeyDown(object sender, KeyEventArgs e)
{
keyIsDown = true;
if (e.KeyCode.ToString() == "F6")
{
while(keyIsDown)
{
//do something
Thread.Sleep(100);
if (!keyIsDown)
break;
//do something
Thread.Sleep(100);
if (!keyIsDown)
break;
//do something
Thread.Sleep(100);
if (!keyIsDown)
break;
//do something
Thread.Sleep(100);
if (!keyIsDown)
break;
break;
}
}
e.Handled = false;
}
void KeyUp(object sender, KeyEventArgs e)
{
keyIsDown = false;
e.Handled = true;
}
解决方案
因为,当您的KeyDown
方法在循环中运行时,其他方法无法运行。即,KeyUp
永远不会运行,你会被卡住。
在 Windows 窗体 (winforms) 应用程序中,一个事件永远不会因另一个事件而中断。第二个事件处理程序 ( KeyUp
) 必须等待第一个事件处理程序终止。
目前尚不清楚您要实现什么,因为您的代码除了等待之外什么都不做。
如果你想做某种动画,你可以在按键按下时启动一个计时器(没有任何循环),然后在计时器的每个滴答声处设置动画,最后在按键按下时停止动画。
例子:
public partial class Form1 : Form
{
private readonly Timer _timer = new Timer();
private readonly string[] _messages =
{ "hello", "world", "", "folks", "we", "made", "it", "" };
private int _index;
public Form1()
{
InitializeComponent();
_timer.Interval = 500; // Milliseconds
_timer.Tick += Timer_Tick;
}
private void Timer_Tick(object sender, EventArgs e)
{
label1.Text = _messages[_index];
_index = (_index + 1) % _messages.Length;
}
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.F6) {
_timer.Start();
}
}
private void Form1_KeyUp(object sender, KeyEventArgs e)
{
_timer.Stop();
label1.Text = "stopped";
_index = 0;
}
}
请注意,应用程序始终在等待事件发生。然后它处理事件并再次等待。我们说 Winforms 应用程序是事件驱动的。
推荐阅读
- html - 有粘性元素时如何将div移到前台?
- php - 如何在laravel中使用辅助键获取记录
- python - 在 python 中渲染 obj 文件
- pandas - Pandas 指的是采样时间序列的组的开始和结束日期
- html - 具有“边界半径:100%;” 当字体大小改变时作为一个理想的圆圈
- python - Pandas 突然更改日期格式
- python - 将颜色条置于 2d 直方图上方(而不是下方)
- soot - 在 Soot 中为 java 代码使用类和方法
- java - 如何在 Java 的 Native HTTP Client 上使用代理密码认证
- java - 如何使 addSnapshotListener 不启动新活动?适用于 Java 但不适用于 Kotlin