![](/img/trans.png)
[英]How can I make sure that a certain line is printed only when the if statement is met in a while-loop
[英]How can i get my While-loop to exit/break, when i release the button?
這里有什么問題嗎? 為什么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 應用程序是事件驅動的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.