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

Posted

技术标签:

【中文标题】C#让程序等待按钮被按下【英文标题】:C# Make Program Wait For Button To Be Pressed 【发布时间】:2011-08-03 10:50:05 【问题描述】:

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

while (!Redpress)

    // I'd like the wait here


Redpress = false;

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

【问题讨论】:

按钮事件已经存在,需要程序等待事件发生。 您不能在用户界面线程中编写这样的代码。它将冻结用户界面。了解 UI 编程的事件驱动性质对于取得成功至关重要。 【参考方案1】:

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

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

【讨论】:

这没有意义,redpress 是一个布尔值,它定义了按钮是否被点击,我已经有一个事件在按下按钮时将布尔值设置为 true。我需要代码让程序等待事件... @Zizo47 - 对不起,我误解了 - 将您需要的代码放在我在评论中指出的处理程序中。 这仍然没有改变任何事情,我需要程序停止并等待我点击按钮,按钮本身没有问题。 @Zizo47 - “停止”是什么意思。如果您将代码放在事件处理程序中,则在按下按钮之前它不会被执行。 让我再解释一下,这是一个西蒙说游戏,它的等待闪烁用户必须按下的按钮,然后“等待”用户按下它。我想让它在该代码的约束内等待,所以只要按下按钮它就不会继续。【参考方案2】:

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();

这将使执行代码等到事件触发。希望对您有所帮助。

注意:请不要误会,除非您有一些特殊情况(我想不出一个在我的头顶上的夜晚!)您应该将代码直接放在事件处理程序中,而不是在事件触发之前阻塞线程。

【讨论】:

您所做的所有事情都是在某个事件上将 redpress 设置为 false,我需要程序等待“那个”事件...【参考方案3】:

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

【讨论】:

【参考方案4】:

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

当我处理这种情况时,我使用自己的队列控制器类。 该类实际上做了 AddAction(Action)、PlayNext() 和 HasActions()

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

我也在按钮事件中执行 AddAction(Action, position) ,然后在 HasActions() PlayNext() 时执行

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

【讨论】:

以上是关于C#让程序等待按钮被按下的主要内容,如果未能解决你的问题,请参考以下文章

C# winfrom程序可以实现按钮的鼠标悬停变色,离开恢复,按下时变成黑色并一直保持吗

Angular等待所有订阅完成

检测功能键被按下的最佳方法是啥?

iOS:让segue等待登录成功

JAVA按下按钮并等待几秒钟[重复]

如何使按钮看起来好像被按下?