2011-04-11 91 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语言,你应该使用信号量或类似的东西。但这似乎并不是你真正需要的,它更像是你想要的