为什么我不能在 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))
考虑这段代码:
$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))