为什么我不能在 PowerShell 的事件处理程序中设置表单的 DialogResult?

Why can't I set a form's DialogResult inside an event handler in PowerShell?

考虑这段代码:

$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'.

为什么要这样做,我如何才能得到 return 我想要的对话结果?

如果计时器关闭表单,DialogResult 将更改为 None,但之后会立即调用 $Form.close()。

由于 Close() 方法将 DialogResult 更改为 Cancel,将 Close() 方法切换为手动更改 DialogResult 并将新枚举值更改为 Abort 将使条件按预期工作。

如果这就是你想要的,我会保持简单并考虑使用旧的方式 WScript.Shell Popup:

$Result = (New-Object -ComObject WScript.Shell).Popup("Do you like to continue?", 3, "Title", (1 + 32 + 4096))