2016-09-12 5 views
0

У меня есть базовый WinForm, с которым я работаю. Я установил FormBorderStyle как None, и я использую событие KeyDown на форме, чтобы проверить, нажата ли клавиша Escape, и если это так, она закрывает форму.Слушатель событий KeyDown, похоже, не работает, когда элементы кнопки добавляются в WinForm

Все работает отлично, пока я не добавлю кнопку. Похоже, что проблема заключается в том, что кнопка автоматически получает фокус во время выполнения, и, поскольку события регистрируются только для того, что элемент имеет фокус (кнопка не имеет прослушивателя KeyDown - форма), она не закрывается, когда я нажимаю кнопку Клавиша Escape.

Я посмотрел на объект WinForm ([System.Windows.Forms.Form]) и искал свойства и методы, относящиеся к фокусу, и большинство из них - get; методов и bool запросов. В идеале это сработает, если что-то вроде свойства $form.StartsWithFocus = $true , но, к сожалению, из того, что я увидел, это не тот случай.

Щелчок снаружи кнопки, но все еще в пределах формы, похоже, не сфокусирован на форме.

Вот упрощенная версия моего 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() 

Это выше откроет небольшую форму в середине экрана. Если вы нажмете клавишу Escape, она закрывается. Просто.


Однако, когда я добавляю кнопку, она перестает работать.

[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

$ form.KeyPreview = $ true! Я знал, что это то, о чем я проглядывал. Это было именно так. У меня это есть на нескольких моих других инструментах и ​​приложениях, но я забыл об этом. Благодаря! – Rincewind

ответ

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 
Смежные вопросы