winforms - 将按钮项添加到 WinForm 时,KeyDown 事件监听器似乎不起作用

标签 winforms powershell

我正在使用一个基本的 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/

相关文章:

azure - 断开 Azure VM 与 loganalytics 工作区的连接

xml - 使用 Powershell 添加和删除 Xmlnode

regex - 使用 RegEx 与 PowerShell 匹配

powershell - 如何在PowerShell中比较两个字符串对象的内容

mysql - 使用 PowerShell 运行带重音符号 (`) 的 MySQL 命令

c# - 直接访问 TableLayoutPanel 单元格

c# - 如何找到实现接口(interface)的类

c# - 如果使用继承,如何检查列表的类型

c# - 如何将按钮添加到 TabPage 的页眉?

c# - 从 C# 2.0 中的另一个线程更新控件