考虑以下代码:
$Form = New-Object System.Windows.Forms.Form
$YesButton = New-Object System.Windows.Forms.Button
$YesButton.Text = "Yes"
$YesButton.Location = New-Object System.Drawing.Point( `
(($Form.Width / 2) - ($YesButton.Width)), 25)
$YesButton.Add_Click({$Form.DialogResult=[System.Windows.Forms.DialogResult]::OK})
$NoButton = New-Object System.Windows.Forms.Button
$NoButton.Text = "No"
$NoButton.Location = New-Object System.Drawing.Point( `
($YesButton.Location.X + $YesButton.Width + 10), $YesButton.Location.Y)
$NoButton.Add_Click({$Form.DialogResult=[System.Windows.Forms.DialogResult]::Cancel})
$Form.Controls.Add($YesButton)
$Form.Controls.Add($NoButton)
$Timer = new-object System.Windows.Forms.Timer
$Timer.Add_Tick(
{
$Form.DialogResult = [System.Windows.Forms.DialogResult]::None
$Form.Close()
})
$Timer.Interval = 3000
$Timer.start()
$Result = $Form.ShowDialog()
if ($Result -eq "OK")
{
Write-Output "User selected 'Yes'."
}
elseif ($Result -eq "Cancel")
{
Write-Output "User selected 'No'."
}
elseif ($Result -eq "None")
{
Write-Output "User selected nothing; prompt timed out."
}
如果我运行它并让计时器打钩关闭该窗体,我希望它命中
elseif ($Result -eq "None")
并因此打印User selected nothing; prompt timed out.
,但是它却撞到了elseif ($Result -eq "Cancel")
并打印了User selected 'No'.
它为什么这样做,以及如何获取它返回我想要的对话框结果?
最佳答案
如果计时器关闭该窗体,则DialogResult更改为None,但随后将立即调用$ Form.close()。
由于Close()方法将DialogResult更改为Cancel,因此在您手动更改DialogResult并将新的枚举值更改为Abort的位置切换Close()方法将使条件条件按预期方式工作。
关于.net - 为什么不能在PowerShell中的事件处理程序中设置表单的DialogResult?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44309964/