2010-11-23 6 views
2

Я использую WinForms. Я создал обработчик события для события KeyDown основной формы, тем самым ссылаясь на обработчик события Click кнопки.Базовая обработка событий WinForm KeyDown

Обработчик события Click зависит от конкретной нажатой клавиши. Если пользователь нажимает кнопку, а не использует ключ, а затем затем пытается использовать ключ после этого, клавиша (например, стрелка вниз) действует как цикл табуляции, изменяя фокус между каждым нажатием кнопки в форме (а не выполняя обработчик Keydown).

Любые идеи?

ответ

1

Как и в случае с SimpleCoder, мне пришлось переопределить член IsInputKey для класса Button.

public class ControlButton : Button 
{ 
    protected override bool IsInputKey(Keys keyData) 
    { 
     if (keyData == Keys.Up) 
     { 
      return true; 
     } 
     else if (keyData == Keys.Down) 
     { 
      return true; 
     } 
     else if (keyData == Keys.Left) 
     { 
      return true; 
     } 
     else if (keyData == Keys.Right) 
     { 
      return true; 
     } 
     else 
     { 
      return base.IsInputKey(keyData); 
     } 
    } 
} 

Тогда мне нужно, чтобы создать экземпляр моих объектов кнопки (в классе дизайнера), используя этот новый класс, например, так:

private ControlButton btnDown; 
    private ControlButton btnRight; 
    private ControlButton btnLeft; 
    private ControlButton btnUp; 

    this.btnDown = new ControlButton(); 
    this.btnRight = new ControlButton(); 
    this.btnUp = new ControlButton(); 
    this.btnLeft = new ControlButton(); 

Следующего Я зарегистрировал OnClick обработчиков для каждого из новых объектов кнопки, как так :

this.btnUp.Click += new System.EventHandler(this.btnUp_Click); 

    private void btnUp_Click(object sender, EventArgs e) 
    {    
     MessageBox.Show("Up"); 
    } 

(и т.д.)

И зарегистрировал KeyDown обработчик для главной формы:

this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.frmUavController_KeyDown); 

    private void frmUavController_KeyDown(object sender, KeyEventArgs e) 
    { 
     if ((e.KeyCode == Keys.Up) || (e.KeyCode == Keys.W)) 
     { 
      btnUp.PerformClick(); 
     } 
     else if ((e.KeyCode == Keys.Down) || (e.KeyCode == Keys.S)) 
     { 
      btnDown.PerformClick(); 
     } 
     else if ((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.A)) 
     { 
      btnLeft.PerformClick(); 
     } 
     else if ((e.KeyCode == Keys.Right) || (e.KeyCode == Keys.D)) 
     { 
      btnRight.PerformClick(); 
     } 
    } 

Задав основную форму собственности KeyPreview к истине, и, видя, как если бы я не был переопределен поведение по умолчанию вверх, вниз, влево и вправо клавиш, кнопки управления больше не но скорее верните true, передав управление обратно в основную форму. Отсюда, если нажаты последующие клавиши (вверх, вниз, влево или вправо), форма выполняет соответствующий обработчик.

0

Используйте Control.GetNextControl и установите фокус на то, что он возвращает.

+0

Я думаю, он пытается предотвратить это поведение, хотя вопрос довольно расплывчатый. – 2010-11-23 06:49:28

+0

Из того, что я понимаю, wulfgarpro хочет поймать KeyDown формы, когда кнопка находится в фокусе и нажаты кнопки со стрелками. – TarasB 2010-11-23 06:51:15

+0

Да, я пытаюсь предотвратить это поведение. Извините, вопрос непонятен. Я не могу объяснить это более ясно. – wulfgarpro 2010-11-23 06:54:09

2

Проблема заключается в том, что кнопка имеет фокус при нажатии, поэтому последующие нажатия клавиш не захватываются самой формой, а вместо кнопок. В обработчик событий нажмите на кнопки, фокус вид:

this.Focus(); 

Таким образом, фокус восстанавливается в виде так форма будет слушать событие вызов.

Редактировать

Реальная проблема, как вы обнаружили, это клавиши со стрелками, что не рассматриваются в качестве входных ключей. Чтобы исправить это, вам нужно создать новый класс, который наследует любой элемент управления, который вы хотите использовать. Затем вы переопределяете метод IsInputKey для обработки клавиш со стрелками в качестве входных клавиш. Проверьте эту ссылку: http://bytes.com/topic/c-sharp/answers/517530-trapping-arrow-keys-usercontrol. Эта статья также полезна: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.isinputkey.aspx.

Смежные вопросы