【问题标题】:Disabled button still triggers Click event禁用按钮仍会触发 Click 事件
【发布时间】:2020-05-15 22:35:30
【问题描述】:

我正在努力防止用户快速点击按钮,这可能会在代码多次执行时冻结应用程序几分钟。

$searchBtn_clicked = {
    $searchBtn.Enabled = $false

    ... some code that fills a listview from search result

    $searchBtn.Enabled = $true
}

我的问题是:无论如何,只要单击按钮,上面的代码就会执行多次。单击后禁用按钮不会改变任何内容。我还尝试在启用它之前添加start-sleep 2

第一次点击触发代码,后续点击是在禁用按钮上...并且仍然会触发 Click 事件,只要按钮再次启用。

这里发生了什么?某种异步魔法?所有点击事件都以某种方式排队,并且仅在按钮再次启用后才被处理?

我是 PowerShell 新手,很困惑。

【问题讨论】:

    标签: forms powershell powershell-studio


    【解决方案1】:

    添加[System.Windows.Forms.Application]::DoEvents():

    $searchBtn.Add_Click({
        $this.Enabled = $false
    
        # ... some code that fills a listview from search result
    
        # flush out all pending events
        [System.Windows.Forms.Application]::DoEvents() 
        $this.Enabled = $true
    })
    

    希望有帮助

    Windows 消息按顺序排队和处理。如果您的代码很忙,这些消息(垃圾邮件点击)将存储在该队列中,并在可能的情况下进行处理。 DoEvents() 告诉窗口处理当前在消息队列中的所有消息,有效地刷新它。

    【讨论】:

    • 是的,这行得通!非常感谢。你能否提供一个简短的解释来帮助我准确理解它为什么/如何表现它的行为方式?
    • @Pascal 我添加了一个简短的解释。
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多