当按钮项添加到WinForm

时间:2016-09-12 20:11:55

标签: winforms powershell

我有一个与我合作的基本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键什么都不做。

那么,哪里出错了?

感谢。

1 个答案:

答案 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