簡體   English   中英

當我松開按鈕時,如何讓我的 While 循環退出/中斷?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM