You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell Windows Forms 切换按钮时消息框重复弹出问题求助

问题原因分析
  • 核心问题是点击事件重复绑定:你将$AlOKButton的Add_Click绑定逻辑写在了$AlButton的点击回调内部,每次你切换按钮点击$AlButton加载界面时,都会给$AlOKButton新增一个点击事件回调,旧的回调不会自动清除。你切换多少次$AlButton,$AlOKButton就会被绑定多少个相同的消息框触发逻辑,点击时所有回调依次执行就会出现多次弹窗的问题。
  • 额外语法问题:你的代码中$VerUsersOK.Add_Click的回调结束后多了一个多余的})闭合符,也可能引发执行逻辑异常。
解决方案

方案1(推荐):将事件绑定移到全局执行

把所有按钮的点击事件绑定放在界面初始化阶段,仅执行一次,不要嵌套在其他按钮的点击回调里,示例修改逻辑:

# 全局只绑定一次,不要放在$AlButton的点击回调里
$VerUsersOK.Add_Click({
    if ($VerUsersTextBox.Textlength -eq 0){
        [System.Windows.MessageBox]::Show('未输入任何信息',$ButtonText,'OK','Error')
    }  
})

$AlOKButton.Add_Click({
    if (($AlUsersTextBox.TextLength -eq 0) -or ($AlPasswordTextBox.TextLength -eq 0) -or ($AlCPasswordTextBox.TextLength -eq 0)){
        $ButtonText = $AlButton.text
        [System.Windows.MessageBox]::Show('未输入任何信息',$ButtonText,'OK','Error')
    }
})

$AlButton.Add_Click({
    $ActiveDirectory.controls.Clear()
    $AlUsersOptionsGroupbox.controls.AddRange(@($AlUsersUnlockCheckBox,$AlUsersDisableCheckBox,$AlUsersMustChangeCheckBox,$AlUsersEnableCheckBox))
    $ActiveDirectory.controls.AddRange(@($ToolsPanel,$ADToolsPanel,$AlPasswordLabel,$AlPasswordTextBox,$AlUsersLabel,$AlUsersTextBox,$AlOKButton,$AlCancelButton,$AlCPasswordLabel,$AlCPasswordTextBox,$AlUsersOptionsGroupbox))
    # 移除这里的$AlOKButton.Add_Click绑定逻辑
})

[void]$ActiveDirectory.ShowDialog()

方案2:绑定前先移除已有事件

如果确实需要在切换界面时动态绑定事件,可以先移除之前的事件再绑定,避免重复:

# 先定义回调函数
$alOkCallback = {
    if (($AlUsersTextBox.TextLength -eq 0) -or ($AlPasswordTextBox.TextLength -eq 0) -or ($AlCPasswordTextBox.TextLength -eq 0)){
        $ButtonText = $AlButton.text
        [System.Windows.MessageBox]::Show('未输入任何信息',$ButtonText,'OK','Error')
    }
}

$AlButton.Add_Click({
    $ActiveDirectory.controls.Clear()
    $AlUsersOptionsGroupbox.controls.AddRange(@($AlUsersUnlockCheckBox,$AlUsersDisableCheckBox,$AlUsersMustChangeCheckBox,$AlUsersEnableCheckBox))
    $ActiveDirectory.controls.AddRange(@($ToolsPanel,$ADToolsPanel,$AlPasswordLabel,$AlPasswordTextBox,$AlUsersLabel,$AlUsersTextBox,$AlOKButton,$AlCancelButton,$AlCPasswordLabel,$AlCPasswordTextBox,$AlUsersOptionsGroupbox))
    # 先移除旧事件再绑定新事件
    $AlOKButton.remove_Click($alOkCallback)
    $AlOKButton.Add_Click($alOkCallback)
})

内容的提问来源于stack exchange,提问作者Pedro El Mexicano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:54:03