c#使程序等待按钮被按下

本文关键字:按钮 等待 程序 | 更新日期: 2023-09-27 17:50:07

我想让程序等待一个按钮被按下,然后再继续,我尝试创建一个while循环,并让它循环,直到按钮被点击,并设置bool为true while循环结束,这使它崩溃

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

是否有while并不重要,只要程序在将"repress"设置为false之前等待按钮按下…什么好主意吗?

c#使程序等待按钮被按下

使用事件-这是它们的设计目的。

您不需要在Button_Click事件处理程序中为此使用布尔变量调用您的代码:

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

正如@trickdev指出的那样,你需要订阅这个事件,但是如果你在Visual Studio中使用Events窗口,它会为你添加必要的代码——包括空处理程序。

对于事件驱动的程序,你总是在等待下一个"事情"发生。所以在你的情况下(如果我正确理解了你的应用程序),当你启动程序时,它应该简单地告诉第一个按钮闪烁"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
    }
}

Windows窗体控件有一个Click事件,您可以在窗体构造函数中订阅:

myButton.Click += myButton_EventHandler;

然后你可以把任何你想要发生的逻辑放在处理程序中,当按钮被点击时,它将执行:

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

你应该避免阻塞(以任何方式,旋转睡眠等)主线程在你的表单应用程序,因为这会锁定接口,有很多方法可以避免这种情况,包括定时器,线程,委托和后台工作人员等等。

编辑:包括你的更新

您可以使用ManualResetEvent

private readonly ManualResetEvent mre = new ManualResetEvent(false);
private void myButton_EventHandler(object sender, EventArgs e)
{
    mre.Set();
}

你的Form代码可以通过调用:

mre.WaitOne();

这将使执行代码等待,直到事件被触发。希望对你有帮助。

注意:请不要搞错,除非你有一些特殊情况(我想不出一个在晚上的这个时候我的头!)你应该把代码直接放在事件处理程序中,而不是阻塞一个线程,直到事件被触发。

如果您需要程序等待该事件,那么不要在主访问/页面加载中编写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语言,你应该使用信号量或类似的东西。但这似乎不是你真正需要的,它更像是你想要的

不知道你为什么要呆在那里,我认为这是真正的问题。我猜你在代码中,在某些情况下,你想在用户操作时执行另一段代码,然后在主块中恢复剩余的代码。

处理这种情况时,我使用自己的Queue Controller类。这个类实际上执行AddAction(Action), PlayNext()和HasActions()

所以在你的那个点上,我在你的循环之后添加代码到我的类中的一个动作中并执行AddAction。

我也做AddAction(动作,位置)在按钮事件,然后当HasActions() PlayNext()

这样我就不会阻塞界面,并确保按钮代码将在我的两段代码之间运行。