繁体   English   中英

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

[英]C# Make Program Wait For Button To Be Pressed

我想让程序在继续之前等待按下按钮,我尝试创建一个while循环并让它循环直到单击按钮并将while循环设置为true以结束while循环,这使它崩溃

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

Redpress = false;

while 是否存在并不重要,只要程序在将“Redpress”设置为 false 之前等待按钮按下...有任何想法吗?

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

您不需要在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
    }
}

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

myButton.Click += myButton_EventHandler;

然后,您可以在处理程序中放置您想要发生的任何逻辑,这将在单击按钮时执行:

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

您应该避免在表单应用程序中阻塞(以任何方式,旋转睡眠等)主线程,因为这会锁定接口,有很多方法可以避免这种情况,包括计时器、线程、委托和 BackgroundWorkers 等等。

编辑:包括您的更新

为此,您可以使用ManualResetEvent

private readonly ManualResetEvent mre = new ManualResetEvent(false);

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

您的表单代码可以通过调用等待:

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(Action, position) 然后在 HasActions() PlayNext()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM