我正在使用一个基本的 WinForm。我已将 FormBorderStyle
设置为 None
,并且在表单上使用 KeyDown
事件来检查 Escape 键是否被按下,以及是否按下是的,它关闭表单。
一切都很完美,直到我添加一个按钮。问题似乎是按钮在运行时自动获得焦点,并且由于事件仅注册任何具有焦点的项目(按钮没有 KeyDown
监听器 - 表单有),因此它没有当我按 Escape 键时不关闭。
我查看了WinForm对象([System.Windows.Forms.Form]
)并搜索了焦点引用的属性和方法,大部分都是get;
方法和 bool
查询。理想情况下,如果有类似 $form.StartsWithFocus = $true
set;
属性的东西,它就会起作用,但不幸的是,从我所看到的情况来看,情况并非如此。
单击按钮外部但仍在表单内似乎不会将焦点更改为表单。
这是我的 WinForm 的简化版本。难道我缺少什么吗?
[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
$form = New-Object Windows.Forms.Form
$form.StartPosition = 'CenterScreen'
$form.Add_KeyDown({
if($_.KeyCode -eq "Escape") {
$form.Close()
}
})
$form.Add_Shown({$form.Activate()})
$form.ShowDialog()
上面的操作将在屏幕中间打开一个小表单。如果按 Esc 键,它将关闭。简单。
但是,当我添加按钮时,它停止工作。
[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
$form = New-Object Windows.Forms.Form
$form.Add_KeyDown({
if($_.KeyCode -eq "Escape") {
$form.Close()
}
})
$button = New-Object Windows.Forms.Button
$button.Location = '20,20'
$button.Size = '100,30'
$form.Controls.Add($button)
$form.Add_Shown({$form.Activate()})
$form.ShowDialog()
如果您运行此命令(上面),按 Escape 键不会执行任何操作。
那么,这到底是哪里出了问题呢?
谢谢。
最佳答案
如果窗体的其中一个控件具有焦点,则窗体不会接收 KeyDown 事件,除非您设置属性 KeyPreview为真。
[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
$form = New-Object Windows.Forms.Form
$form.Add_KeyDown({
if($_.KeyCode -eq "Escape") {
$form.Close()
}
})
$form.KeyPreview = $true
......
另一种可能性是将表单的 CancelButton 设置为新创建的按钮的实例并省略关闭代码(但您可能仍然需要其他任务的 KeyPreview 设置,所以......)
[void][Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms')
$form = New-Object Windows.Forms.Form
$form.Add_KeyDown({
# if($_.KeyCode -eq "Escape") {
# $form.Close()
# }
})
$button = New-Object Windows.Forms.Button
$button.Location = '20,20'
$button.Size = '100,30'
$form.CancelButton = $button
#$form.KeyPreview = $true
关于winforms - 将按钮项添加到 WinForm 时,KeyDown 事件监听器似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39458086/