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
相关产品推荐
相关产品推荐

