2011-04-11 118 views
5

我想讓程序等待按鈕被按下,然後繼續,我嘗試創建一個while循環並讓它循環直到按鈕被單擊並將bool設置爲true while循環結束,這使得它崩潰C#讓程序等待按鈕被按下

while (!Redpress) 
        { 
         //I'd like the wait here 
        } 
        Redpress = false; 

不要緊的,而不論是否是存在的,只要程序「Redpress」設置爲false之前等待按下按鈕.. 。 有任何想法嗎?

+0

按鈕事件已經存在,我需要程序來等待事件。 – Zizo47 2011-04-11 22:48:12

+0

您不能在用戶界面線程中編寫這樣的代碼。它會凍結用戶界面。理解UI編程的事件驅動本質對於取得成功至關重要。 – 2011-04-11 23:38:29

回答

6

使用事件 - 這是他們設計的。

你並不需要使用布爾變量爲此在Button_Click事件處理程序調用代碼:

private void Button_Click(object sender, EventArgs e) 
{ 
    // The code you need to execute when the button is pressed 
} 

由於@trickdev指出您需要訂閱這個事件,但如果你使用在Visual Studio中的事件窗口,它會爲你添加必要的代碼 - 包括空處理程序 - 。

隨着事件驅動的程序,你總是等待,直到下一個「事情」發生。所以在你的情況下(如果我已經正確理解你的應用程序),當你啓動程序時,它應該簡單地告訴第一個按鈕閃爍「N」次。如果您將其作爲事件編寫,則代碼完成後,應用程序將返回到等待狀態。

然後在按鈕中單擊事件處理程序 - 您可以將所有按鈕訂閱到同一個事件 - 您可以檢查是否按下了正確的按鈕,然後告訴下一個按鈕閃爍。如果錯誤的按鈕被按下,則顯示合適的消息。

因此,在僞代碼,您有:

public class Form 
{ 
    Initialise() 
    { 
     this.Loaded += FormLoaded; 
    } 

    private void FormLoaded(object sender, EventArgs e) 
    { 
     // pick a button 
     pickedButton.Flash(); 
    } 

    private void Button_Click(object sender, EventArgs e) 
    { 
     if (sender == pickedButton) 
     { 
      pickedButton = pickButton(); 
     } 
     else 
     { 
      message = "Sorry wrong button, try again"; 
     } 

     pickedButton.Flash(); 
    } 
} 

public class Button 
{ 
    public void Flash() 
    { 
     // loop N times turning button on/off 
    } 
} 
+0

這沒有任何意義,redpress是一個bool,它定義了按鈕是否被點擊過,當按下按鈕時,我已經有一個事件來將bool設置爲true。我需要代碼來使程序等待事件... – Zizo47 2011-04-11 22:43:48

+0

@ Zizo47 - 對不起,我誤解了 - 把你需要的代碼放到我已經用註釋表示的處理程序中。 – ChrisF 2011-04-11 22:45:18

+0

這仍然不會改變一件事,我需要程序停下來等待我點擊按鈕,我對按鈕本身沒有任何問題。 – Zizo47 2011-04-11 22:51:04

3

Windows窗體控件都可以在窗體的構造訂閱點擊事件:

myButton.Click += myButton_EventHandler; 

然後你可以把你想要的任何邏輯發生在處理程序中,當按鈕被點擊時,這將執行:

private void myButton_EventHandler(object sender, EventArgs e) 
{ 
    Redpress = false; 
} 

您應該避免在窗體應用程序中阻塞(以任何方式,旋轉休眠等)主線程,因爲這會鎖定界面,有很多方法可以避免這種情況,包括Timers,Threads,Delegates和BackgroundWorkers等等。

編輯:包括您更新

爲此,您可以使用ManualResetEvent

private readonly ManualResetEvent mre = new ManualResetEvent(false); 

private void myButton_EventHandler(object sender, EventArgs e) 
{ 
    mre.Set(); 
} 

表單代碼可以通過調用等待:

mre.WaitOne(); 

這將使執行代碼等到事件已經被解僱。希望有所幫助。

注意:儘管如此,請不要誤會,除非你有特殊情況(在這個夜晚的時候我無法想到一個頭頂的問題!),你應該把代碼直接放在事件中處理程序,而不是在事件觸發前阻塞線程。

+0

你在那裏所做的所有事件都設置爲false,我需要該程序來等待「那個」事件... – Zizo47 2011-04-11 22:47:13

+0

這應該是個訣竅。 – trickdev 2011-04-11 23:03:43

0

如果您需要程序來等待該事件,那麼不要在主要訪問/頁面加載中寫入waitForTheButton代碼。

反而寫你的代碼裏面的事件。所以你不必積極等待。事件就是這樣。

例如:如果你有這樣的事情

static void Main() 
{ 
    while (notPressed) { } 
    DoThis(); 
    DoThat(); 
} 

然後,你可以將其更改爲:

static void Main 
{ 
    myButton.OnClick += myButton_EventHandler; 
} 

private void myButton_EventHandler(object sender, EventArgs e) 
{ 
    DoThis(); 
    DoThat(); 
}          

如果你真的想在程序範式甚至當你的工作使用OOP語言,你應該使用信號量或類似的東西。但這似乎並不是你真正需要的,它更像是你想要的