我有一个与我合作的基本WinForm。我已将FormBorderStyle
设置为None
,我在表单上使用KeyDown
事件来检查是否按下了Escape键,如果是,则关闭表单。
在我添加按钮之前,一切都很完美。似乎问题是按钮在运行时自动获得焦点,并且因为事件只注册任何具有焦点的项目(按钮没有KeyDown
监听器 - 表单确实如此),它不会&# 39;当我按下退出键时关闭。
我查看了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键什么都不做。
那么,哪里出错了?
感谢。
答案 0 :(得分:1)
如果其中一个控件具有焦点,则表单不会收到KeyDown事件,除非您将属性KeyPreview设置为true。
[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