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

标签 .net winforms powershell powershell-5.0

考虑以下代码:

$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/

相关文章:

c# - 不可变列表不添加数据

.net - ListView.ItemCollection.Contains() 如何工作?

web-services - 我可以使用 PowerShell 编写 WebService 吗?

powershell - 无需身份验证通过 powershell 发送邮件

windows - 如何在带空格的路径中运行 PowerShell 脚本?

c# - 如何关闭由 Graphics.DrawString 执行的布局矩形内的文本填充?

c# - 在 .NET 中使用 'Type' 和 'Enum' 作为参数

c# - Silverlight - 通过 C# 将文本添加到 Bing map 中的图钉

c# - 检测到跨线程操作?

C# 在拆分容器顶部隐藏和显示面板